t(3+j*4, 1);
pstmt.setInt(4+j*4, 1);
}
// System.out.println (" Statement Execute Batch Value " +((OraclePreparedStatement)pstmt).getExecuteBatch());
startTime = System.currentTimeMillis();
pstmt.execute();
stopTime = System.currentTimeMillis();
System.out.println("拼接15000条INSERT SQL 第一次运行的耗时 Elapsed time was " + (stopTime - startTime) + " miliseconds.");
startTime = System.currentTimeMillis();
pstmt.execute();
stopTime = System.currentTimeMillis();
System.out.println("拼接15000条INSERT SQL 第二次运行的耗时 Elapsed time was " + (stopTime - startTime) + " miliseconds.");
cnn1.createStatement().execute("alter system flush shared_pool");
System.out.print("\n alter system flush shared_pool 已刷新共享池,避免SQL游标缓存 影响第二次测试 \n");
startTime = System.currentTimeMillis();
int batch=1000;
PreparedStatement pstmt2 = cnn1.prepareStatement("insert into insertit values( , , , )");
((OraclePreparedStatement)pstmt2).setExecuteBatch(batch);
for (int z=0;z<=15000;z++)
{
pstmt2.setInt(1, z);
pstmt2.setInt(2, z);
pstmt2.setInt(3, z);
pstmt2.setInt(4, z);
pstmt2.executeUpdate();
}
((OraclePreparedStatement)pstmt2).sendBatch();
cnn1.commit();
stopTime = System.currentTimeMillis();
System.out.println("batch size= "+batch+" 常规循环 15000 次 INSERT SQL 第一次运行的耗时 Elapsed time was " + (stopTime - startTime) + " miliseconds.");
startTime = System.currentTimeMillis();
PreparedStatement pstmt3 = cnn1.prepareStatement("insert into insertit values( , , , )");
((OraclePreparedStatement)pstmt3).setExecuteBatch(batch);
for (int z=0;z<=15000;z++)
{
pstmt3.setInt(1, z);
pstmt3.setInt(2, z);
pstmt3.setInt(3, z);
pstmt3.setInt(4, z);
pstmt3.executeUpdate();
}
((OraclePreparedStatement)pstmt3).sendBatch();
cnn1.commit();
stopTime = System.currentTimeMillis();
System.out.println("batch size= "+batch+" 常规循环 15000 次 INSERT SQL 第二次运行的耗时 Elapsed time was " + (stopTime - startTime) + " miliseconds.");
String insert = "insert into insertit values ( , , , )";
PreparedStatement pstmt4 = cnn1.prepareStatement(insert);
startTime = System.currentTimeMillis();
for (int u=0;u<=15000;u++)
{
pstmt4.setInt(1, u);
pstmt4.setInt(2, u);
pstmt4.setInt(3, u);
pstmt4.setInt(4, u);
pstmt4.addBatch();
}
pstmt4.executeBatch();
cnn1.commit();
stopTime = System.currentTimeMillis();
System.out.println(" BATCH update 第一次运行的耗时 Elapsed time was " + (stopTime - startTime) + " miliseconds.");
}
}
拼接SQL和PreparedStatement.setExecuteBatch均执行2次,第一次没有游标缓存,第二次有游标缓存。PreparedStatement+addBatch()+executeBatch()只执行一次。
以下为JAVA程序端的测试结果:
alter system flush shared_pool 已刷新共享池,避免SQL游标缓存 影响第一次测试
拼接15000条INSERT SQL 第一次运行的耗时 Elapsed time was 441299 miliseconds.
拼接15000条INSERT SQL 第二次运行的耗时 Elapsed time was 5938 miliseconds.
alter system flush shared_pool 已刷新共享池,避免SQL游标缓存 影响第二次测试
batch size= 1000 常规循环 1500