Java-HSQLDB优化1.000.000批量插入
作者:互联网
我需要尽快在Tomcat上的HSQLDB中插入1.000.000条目,但是64m(Tomcat上的默认MaxPermSize)不足以容纳此代码,并且出现“ OutOfMemoryError”(我想在默认设置下插入).
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO USER (firstName, secondName) VALUES(?,?)");
for (int i = 0; i < 1000000; i++) {
preparedStatement.setString(1, "firstName");
preparedStatement.setString(2, "secondName");
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
connection.commit();
我写的是:http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#dec_bulk_operations.我设置了“ SET FILES LOG FALSE”,但没有帮助.
>是否可以使用MaxPermSize = 64m插入1.000.000条目?
>为什么在此代码中,tomcat吃了那么多内存?那里1.000.000 * 19(“ firstName”“ secondName”的长度)* 2(1个符号上的字节)=〜40Mb.
>为什么在内存表中插入比在缓存表中插入要快?难道我做错了什么 ?
解决方法:
>也许尝试以较小的组合来完成.它将消耗更少的内存,并且可能会更高效.
>计算内存大小要困难得多.例如,您不会将firstName存储一百万次,该值将被内部化,但是您将必须存储一百万次引用.然后,您所有的库都会消耗内存,等等.
>您怎么称呼“缓存表”?
尝试这样做,至少会消耗更少的内存:
connection.setAutoCommit(false);
PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO USER (firstName, secondName) VALUES(?,?)");
for (int i = 0; i < 1000000; i++) {
preparedStatement.setString(1, "firstName");
preparedStatement.setString(2, "secondName");
preparedStatement.addBatch();
if(i % 1000 == 0)
preparedStatement.executeBatch();
}
preparedStatement.executeBatch();
connection.commit();
编辑:您确定是因为烫发的大小吗?您可以放置堆栈跟踪吗?
标签:performance,jdbc,hsqldb,java 来源: https://codeday.me/bug/20191031/1977038.html