在我的Java应用程序中,我需要在硬盘上存储一个大表,因为我希望它可以保持持久性。
我的第一次尝试是这样的:(i和j可以爬升到300.000甚至更多,所以我有300.000 ^ 2两次进入的数组,这会使我的系统崩溃。)
stmt.executeUpdate("DROP TABLE IF EXISTS calculations;");
stmt.executeUpdate("CREATE TABLE calculations (factorA, factorB, result);");
double temp = 0;
for (i = 0; i < datasource.size(); i++) {
for (int j = 0; j < datasource.size(); j++) {
if (i != j) {
temp = calc(datasource.get(i),datasource.get(j));
stmt.execute("INSERT INTO calculations (factorA, factorB, result) VALUES ('"+i+"','"+j+"','"+temp+"')");
}
}
}
现在,这执行起来非常慢,可能是因为SQL命令是字符串等。
我的新猜测是,最好先计算10.000 i的结果,然后将它们作为一个单位存储到数据库中。
但是在我尝试实施之前,有没有一个更好的主意?数据库使用不是强制性的,只是易于访问且易于实现。
尝试将每n
行左右的行添加到一个行中Transaction
(假设失败不是问题,例如,如果某些行无法插入,则可以继续操作而无需回滚先前的行)。声明一个取消循环:
int n = 1000; //commit every 1000 rows, or you can tweak
int count = 0; //counter for rows inserted
在外循环中开始事务。增加并检查内循环中的计数器
if(count % n == 0){
//commit the transaction
}
count++
(不要忘记在外部循环中再次重新打开Transaction)
http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句