sql语句把两个问号改成相关参数,放在sql2000的企业管理器运行正常,但放在程序里,却发现sql2000占用cpu100%,多时都没有反映。郁闷

解决方案 »

  1.   

    这并不说明你执行数据库操作时的速度慢,可能是你的某些其它语句有问题,看看是否用到了死循环,一直不能跳出这个循环导致cpu占用率较高?
    还有最好将代码优化一下!
      

  2.   

    语句直接在sql2000的企业管理器运行正常,但一用jdbc就有问题了,还有怎么将代码优化?谢谢
      

  3.   

    更郁闷的问题是把
    pstmt = con.prepareStatement("select k1.cc, k1.id from lksk k1 inner join lksk k2 on k1.cc=k2.cc where k1.czm=? and k2.czm=? and k1.jlxh<k2.jlxh and k1.lcdd<>k1.lcfd");
                pstmt.setString(1, czm1);
                pstmt.setString(2, czm2);改成
    pstmt = con.prepareStatement("select k1.cc, k1.id from lksk k1 inner join lksk k2 on k1.cc=k2.cc where k1.czm='成都' and k2.czm='上海' and k1.jlxh<k2.jlxh and k1.lcdd<>k1.lcfd");
    结果一下子就出来了。那位高手给个解释啊?
      

  4.   

    用BMP你就需要面临这个问题,BMP的批查询是正常JDBC查询效率的N+1倍左右。因为BMP在调用finder方法的时候先到数据库中查出所有匹配的结果集的主键,然后依次调用ejbLoad方法组装对应的bean实例,所有如果结果集有N条记录,BMP要做N+1次数据库查询,并且调用N次ejbLoad方法,效率当然慢。还是考虑用JDBC吧。
    当然有的服务器对CMP做了优化可能效率会高一点,或者用hibernate,单机应用它比EJB好很多。
      

  5.   

    >>因为BMP在调用finder方法的时候先到数据库中查出所有匹配的结果集的主键,然后依次调用ejbLoad方法组装对应的bean实例,所有如果结果集有N条记录,BMP要做N+1次数据库查询,并且调用N次ejbLoad方法,效率当然慢。同意。真不知道为什么规范要厂商这样实现BMP。
      

  6.   

    不过楼主的问题应该不是EJB的问题,应该是JDBC的问题把
      

  7.   

    对啊,各位老大,帮帮忙吧。直接用jdbc调式也不行啊。郁闷
      

  8.   

    你返回的结果集是不是很大??这也可能慢
    顺便问一句,BigDecimal id = rs.getBigDecimal("k1.id");中的k1.id不会有问题吗?
    我访问字段一般不用别名
    BigDecimal id = rs.getBigDecimal("id");
      

  9.   

    还没有到BigDecimal id = rs.getBigDecimal("k1.id");那一步,
    在System.out.println("done");就已经执行不下去了。返回集合不算大。几十条而已
      

  10.   

    楼主,你的k1.cc和k1.id是不是有clustered index?
      

  11.   

    k1.id有clustered index,它是主键。这里有问题吗?
      

  12.   

    看来没有人回答了,感谢大家的捧场。
    这个应该是一个典型的JDBC问题,正如我问题所说,在数据有50多万条的情况下,用preparedstatement语句传参数运行sqlserver会长时间的占用cpu达到90%以上,且不出结果。当我把数据减到小于1万条时,运行正常。而另人奇怪的还在于在数据有50多万条的情况下,用jdbc:odbc进行连接时,直接把参数写进语句执行时,情况正常。传参数执行却错误
    在我又用microsoft:jdbc进行连接时,无论直接把参数写进语句执行还是穿参数运行,都会长时间的占用cpu达到90%以上,且不出结果。
    最后我只有在sqlserver中写了一个存储过程,语句相同。通过程序调用。运行正常。
    所以我在想:因为jdbc的机制是将sql语句“翻译”成数据库能识别的语句。是不是在microsoft:jdbc和jdbc:odbc中对该语句的“解释”是否存在缺陷?本贴中午结,如果那位还有什么想法欢迎继续发表。
      

  13.   

    >>k1.id有clustered index,它是主键。这里有问题吗?
    很慢的时候,你用DBCC MEMUSAGE看看然后你把它改成non clustered index再试试用DBCC MEMUSAGE看看给我结果,我再替你分析
      

  14.   

    不知道DBCC MEMUSAGE是什么。
      

  15.   

    你在Query Analyzer里面直接执行就行了
      

  16.   

    要在你执行那个SQL特别慢的时候执行dbcc,然后把选出来的结果贴出来阿...
      

  17.   

    在网页上执行
    <%
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      java.sql.Connection c = java.sql.DriverManager.getConnection("jdbc:odbc:test", "sa", "flying");
      java.sql.PreparedStatement pstmt = c.prepareStatement("SELECT * FROM lksk k1 left JOIN lksk k2 ON k1.cc = k2.cc WHERE (k1.czm = ?) AND (k2.czm = ?)");
      pstmt.setString(1, "成都");
      pstmt.setString(2, "上海");
      System.out.println("searching...");
      java.sql.ResultSet rs = pstmt.executeQuery();
      System.out.println("done");
      %>
    查询分析器执行
    SELECT * FROM lksk k1 left JOIN lksk k2 ON k1.cc = k2.cc WHERE (k1.czm = '成都') AND (k2.czm = '上海')是不是啊?
    现在就都没有反映了
      

  18.   

    我知道执行这个没反应或者很慢,那你在QA里看看dbcc阿,一定要在sql执行的时候看,然后把clustered index改成non-clustered index再在执行的时候看看dbcc。
    你明白了没有???