-1

Java で StringBuilder クラスを使用して、次の方法でメソッドで大きな文字列値を作成しています。

void parent() {

   int result = 0;

   while(true) {
     String s = "Some value";
     result = child(s);

     if(result == -1) {
        break;
     }
   }
}

int child(String s) {

   result = xDao.createNativeQuery(s).getResultList();

   if(result == null) {
       return -1;
   }

   StringBuilder builder = new StringBuilder()

   builder.append("INSERT INTO table_name VALUES(");

   for(int i = 0; i < result.length; i++) {
          builder.append(Message.Format("{0}, {0}..", result[i].val1, result[i].val2..); // This will create some big string.
   }

   // Do some operation with builder.
   dataDao.createNativeQuery(builder.toString()).executeUpdate();


   return 0;
}

ここで、child() が 100 回以上実行され、70 回目以降 (またはそれ以上) に java.lang.OutOfMemoryError が発生します。

この記事を読みましたhttp://mohammed-technical.blogspot.in/2010/09/javalangoutofmemoryerror-with.html

StringBuilder がサイズを2倍にする方法を説明しているように。しかし、私の場合、私は常に子の内部で StringBuilder の新しいインスタンスを作成しています。なぜ StringBuilder のために java.lang.OutOfMemoryError をスローしているのでしょうか?

何か提案はありますか?

アップデート:

私は実際に StringBuilder を使用して SQL 挿入ステートメントを作成しています。したがって、次の操作が行われます。

 builder.append("INSERT INTO table_name VALUES(");

 While(condition) {
          builder.append(Message.Format("{0}, {0}..", var1, var2..); // This will create some big string.
 }

最後に、child() 自体で次の行を呼び出します。

dataDao.createNativeQuery(builder.toString()).executeUpdate();
4

1 に答える 1

0

JDBC リソースを使用する場合、それらを close() して正しくクリーンアップする必要があります。そうしないと、メモリリークが発生します。このリークに初めて気付くのは、文字列を作成しようとしたときに十分なメモリが残っていない場合です。

あなたのポイントを取得しませんでした。あなたが指摘しようとしていることをもう少し説明できますか?

PreparedStatement または ResultSet を作成するときは、それらを close() する必要があります。そうしないと、Connection がそれらへの参照を保持するため、引き続きメモリを使い果たします。

次のコードは、ステートメントを作成し、それに対して executeUpdate() を呼び出してから破棄していることを示しています。残念ながら、これは JDBC では機能しません。

dataDao.createNativeQuery(builder.toString()).executeUpdate();

http://www.java-blog.com/correct-closing-jdbc-resources

http://www.ibm.com/developerworks/websphere/library/bestpractices/closing_and_releasing_jdbc_resources.html

http://blog.shinetech.com/2007/08/04/how-to-close-jdbc-resources-properly-every-time/

于 2012-11-05T16:18:06.143 に答える