日期:2014-05-20  浏览次数:20598 次

通过JDBC方式查询数据库生成数据效率低,请问下问题出在什么地方或者有什么解决方案?
测试环境:
WindowsXP SP3 + SQLServer 2005 + JBOSS 5.1.0GA + sqljdbc.jar
数据源配置
  <connection-url>jdbc:sqlserver://127.0.0.1:1433;DatabaseName=uh_real</connection-url>
  <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
  <user-name>test</user-name>
  <password>test</password>
  <metadata>
  <type-mapping>MS SQLSERVER2000</type-mapping>
  </metadata>
测试代码
ResultSet rs;
PreparedStatement pstmt;
..................
rs = pstmt.executeQuery();
MyObject obj;
while (rs.next()) {
  obj = new MyObject();
  obj.setId(rs.getInt("id"));
  ..........
}
.........

MyObject的字段不超过20个
测试结果,pstmt.executeQuery();花了大概200ms,取出500条左右的纪录,
然后执行 while(rs.next())循环转化成对象花去大概5s,很不理想。
通过SQL Server Management Studio查询并显示同样的纪录大概200ms
请教下大家,问题出在什么地方??谢谢

------解决方案--------------------
与机器性能有关,你如果使用Hibernate持久 用HQL语言获取会快点
------解决方案--------------------
在url上增加“SelectMethod=cursor”
另外尽量减少字段,尤其是较大的字段。
------解决方案--------------------
pstmt.setFetchSize(1000) 试试
------解决方案--------------------
jdbc 性能可比hibernate等都好
------解决方案--------------------
JDBC直接访问数据库,没经过一些中间处理和转换过程,效率要比Hibernate好
但编码的复杂度要比Hibernate高很多!
------解决方案--------------------
你试试看把left join里面的条件中等号两边的内容对调一下有没有效果。

啥根据都没有,完全瞎说的

留名学习

good luck
------解决方案--------------------
探讨
我把
conn.prepareStatement(strBuilder.toString());
pstmt.executeQuery();
修改成
stmt = conn.createStatement();
stmt.executeQuery(strBuilder.toString());
效率就从6000ms,缩短到100ms了,何解?


------解决方案--------------------
如果没有参数Statement 比prepareStatement快;
有参数的话(动态sql)Statement 大多数情况比较慢了
------解决方案--------------------
应该是sql语句的问题,自己看看能否在优化,用性能分析器看看哪个步骤消耗资源比较大,是否需要建立联合索引来解决。
------解决方案--------------------
关注中。
jdbc算是java操作数据库最直接的方法了,在提高效率上我能想到的是优化sql,使用商品级的连接池,而hibernate基本上就不是为提高效率而来的,至于while(rs.next())花去5s我还真不知道说什么了。