数据库
首页 > 数据库> > Java-HSQLDB优化1.000.000批量插入

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