我在 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 如何将其大小加倍。但在我的情况下,我总是在孩子内部创建一个新的 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();