2016-04-01 43 views
4

としたDriverManager.getConnectionを使用したとき、私はJSONオブジェクトに特定のテーブルを格納するための直接ファイルパスを経由してMS Accessファイルへの接続を作成するために、UCanAccessと一緒にJDBCを使用しています。しかし、接続を作成するコードメモリ消費UCanAccess

connは初期化されていない接続オブジェクトである
conn = DriverManager.getConnection(s1+inFilePath, user, pass); 

の私のラインは、最終的にはGCオーバーヘッドの上限を超えることになり、メモリリークのいくつかの並べ替えを引き起こしています。

この問題を回避する方法はありますか?ヒープサイズを変更せずに結果を試しました。

+1

接続URLに '; memory = false'を含めて試してみましたか? –

+0

これを追加しようとしましたが、.getConnection()行が実行を完了しません。 – matt

+0

私はあなたが何を求めているのか分かりません。メモリリークの原因と思われることを説明してください。コンテキストのためのより多くのコードを表示します。あなたはそれを完了したときに実際に接続を閉じますか? –

答えて

2

メモリリークではありません。 UCanAccessは通常の操作の一環としてメモリを消費しています。

はUCanAccessは、SQL操作をサポートするために、AccessデータベースのHSQLDB「ミラー」を使用し、ミラーデータベースをメモリ内に作成され、デフォルトで。したがって、30 MBのデータを含むテーブルを持つAccessデータベースに接続すると、UCanAccessは約30 MBのメモリを使用してミラーデータベースを格納します。接続URLに;memory=falseを追加は

は、ディスク上の代わりに、メモリにHSQLDBミラー・データベースを作成するためにUCanAccessを教えてくれます。これにより、メモリ要件が大幅に削減されるが、接続の確立(ミラーデータベースの作成)にも時間がかかる。

UCanAccessも「ミラー」、それは指定されたデータベースで見つかったすべてのテーブル。あなたは「main.accdb」という名前のデータベースにある特定のテーブルで作業のみに関心があるのであれば、あなたは

  • 例えば、「link.accdb」
  • は、リンクを作成し、新しいAccessデータベースを作成することができます"link.accdb"のテーブルで "main.accdb"の実際のテーブルを指していて、次に
  • を使用して "link.accdb"を開きます。

上記の手順を使用すると、UCanAccessは1つのテーブルのみをミラーリングします。

UCanAccessのミラーリング動作を制御するいくつかのオプションがあります。詳細はUCanAccess websiteをご覧ください。

関連する問題