我猜想:
主要原因出在你的数据库上面,mysql不是一严格意义的关系型数据库,几乎没有对事务、存储过程的支持。而PreparedStatement则是将sql变成sp再进行处理,所以反而导致了效率低下!而在一些高端的数据库上测试的话,你会得到不同的结果。
主要原因出在你的数据库上面,mysql不是一严格意义的关系型数据库,几乎没有对事务、存储过程的支持。而PreparedStatement则是将sql变成sp再进行处理,所以反而导致了效率低下!而在一些高端的数据库上测试的话,你会得到不同的结果。
解决方案 »
- 同一台服务器上部署两个TOMCAT
- 当数据库(Oracle)中的某一个表的某行记录有更新时,怎样及时的通知应用程序
- 我本来项目是用GBK写的,但是都要转成uft-8我把码全换了就出了以下的错求解
- commons-digester 在应用环境下总是出现ClassNotFoundException!
- 大家都用什么工作流作开发?
- 关于activiti 5.5中如何用表达式指定userTask节点的处理人
- hibernate 用SQLQuery 调用存储过程的参数问题
- 即将用JAVA开发一个系统,请大家多多提建议,谢谢!
- 兄弟们,怎么用j2ee的deploy工具部署sessionBean
- JBOSS难了我一周了,分不够可以再加
- 向SQL Server数据库插入值错误?
- 请问Digester类的作用是什么?
你把测试程序列出来,看一下
是不是,你每次插入一数据的时候生成一个PreparedStatement,
这样的话,就错了,
应该是生成一个PreparedStatement,然后通过传递不同的参数反复利用
生成一个PreparedStatement后将参数修改,直接在循环中使用executeQuery
执行的话应该比Statement
PreparedStatement stmt=conn.prepareStatement("insert into tt values(?,?,?)");
System.out.println(new java.util.Date().toString());
for(int i=0;i<10000;i++)
{
stmt.clearParameters();
stmt.setString(1,"aa");
stmt.setString(2,"bb");
stmt.setString(3,"cc");
stmt.executeUpdate();
}
System.out.println(new java.util.Date().toString());
我在sql server 2000下做过同样测试,效果同样让人沮丧
1、PreparedStatement stmt=conn.prepareStatement("insert into tt values(?,?,?)");
for(int i=0;i<10000;i++)
{
stmt.clearParameters();
stmt.setString(i,"aa");
stmt.executeUpdate();
}2、PreparedStatement stmt=conn.prepareStatement("insert into tt values(?,?,?)");
for(int i=0;i<10000;i++)
{
stmt.clearParameters();
stmt.setString(i,"aa");
}
stmt.executeUpdate();
ORA-01008: 并非所有变量都已关联
{
stmt.clearParameters();
stmt.setString(i,"aa");
你的SQl语句只有三个参数,而你循环设置了10000个参数
据说MS提供的SQL Server的JDBC Driver效率很低,换个第三方的试试。我用jsp测试了MySQL,driver是mysql-connector-java-2.0.14-bin.jar,代码如下:
long start = System.currentTimeMillis();
javax.sql.DataSource ds = (javax.sql.DataSource)JNDIRefFactory.newInstance().lookupLocalRef("java:comp/env/jdbc/testDS");
java.sql.Connection conn = ds.getConnection();
java.sql.PreparedStatement stmt = conn.prepareStatement("insert into test values(?,?,?)");
System.out.println(new java.util.Date().toString());
for(int i = 0;i < 10000;i++)
{
stmt.clearParameters();
stmt.setString(1,"aa");
stmt.setString(2,"bb");
stmt.setString(3,"cc");
stmt.executeUpdate();
}
out.println("Time: " + (System.currentTimeMillis() - start));连续测试3次,每组测试前都将原来的记录删光:
结果:5167->4656->4236
改用stmt.execute(),结果:5298->4536->4446改为Statement,结果:5739->4477->4396结果差不多啊!?
javax.sql.DataSource ds = (javax.sql.DataSource)JNDIRefFactory.newInstance().lookupLocalRef("java:comp/env/jdbc/testDS");
java.sql.Connection conn = ds.getConnection();
long start = System.currentTimeMillis();
java.sql.PreparedStatement stmt = conn.prepareStatement("insert into test values(?,?,?)");
for(int i = 0;i < 10000;i++)
{
stmt.clearParameters();
stmt.setString(1,"aa");
stmt.setString(2,"bb");
stmt.setString(3,"cc");
stmt.executeUpdate();
}
out.println("Time: " + (System.currentTimeMillis() - start));这样才是用PreparedStatement/Statement进行insert的时间。
不过,因为我用了ConnectionPool,所以测出来的结果还是和上一个贴子差不多的。
{
stmt.clearParameters();
stmt.setString(1,"aa");
stmt.setString(2,"bb");
stmt.setString(3,"cc");
stmt.addBatch();
}
stmt.executeBatch();