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();