数据库中的数据量比较大,在做如下事务处理的时候发现速度奇慢。求改进方案得到HashMap;//这个HashMap从数据库中读取数据填充,填充效率很高set<Entry<...>> set_hm=HashMap.entrySet();
//然后循环遍历这个set_hm
for<Entry<...>me:set_hm>{
    // 遍历得到key和value赋值给PreparedStatement的set参数,比如:
    ps.setInt(1,me.getKey());
    //然后执行数据库查询操作,返回resultset
    ResultSet rs=ps.executeQuery();//我试过在这个for循环里不加sql查询,直接遍历一下hashmap的元素,效率很高,秒杀,但只要一加这个查询,速度一下子下来。请问有什么方法来解决这个问题
    }

解决方案 »

  1.   

    个人意见,使用JDO。也可以在其他CPU时间比较充裕的时候,先进行JDBC查询。或者换数据库,比如Oracle。
      

  2.   

    我用的是mysql,数据库是不会换了,只想知道在代码上还有没有改进的可能
      

  3.   

    bao110908(长牙了,好痛)能否具体说说
      

  4.   

    与楼上的意思一致,因为与数据库打交道时,JDBC 的大部分时间都花在了数据库连接上,仅有一小小部分的时间是花费在查询上的,也就是说在创建 Connection 对象的开销最大。数据库连接池就是用好后的连接并不是真正的关掉,而是把它们放到一个可以形象化为“池”的地方,以后要用时直接取出来就可以直接使用了,从而可以大大地增加效率,数据库连接的实现较为复杂,可以使用一些开源的工具包。不知道你的问题是这样,还是在给 PreparedStatement 赋值时的花费较大,不知道 Map 里面的数据是否很多?
      

  5.   

    Map 里面的数据的确也很多,但是我试过单单遍历一下map也是很快的,所以问题可能还是在数据库连接上。但是我不理解的是,我并没有在循环里打开关闭数据库连接阿,仅仅在循环中赋参数和执行查询操作阿,觉得貌似和Connection 没什么关系吧???
      

  6.   

    如一定每个KEY值都去查一下数据库,好象只有给KEY字段加个索引会快好多,但还是会感觉慢的.
    但一次从数据库取很多值回来,再查会是个好注意.
      

  7.   

    如果这样的话从代码方面基本上是没有什么优化的可能呢。我还有一个疑问的地方:采用 foreach 对 PreparedStatement 进行赋值,那如何判断是使用 setInt 亦或是使用 setString 或者是其他的进行填充呢?难道数据库中字段都是一种类型?还有 Map 中的泛型参数使用的是什么?是否一个 Map 只给一个 PreparedStatement 进行赋值,再在 foreach 循外进行 ResultSet rs=ps.executeQuery();
      

  8.   

    c#区的兄弟们有人建议说不要加查询条件,直接把所有东西select出来,然后再在内存里操作。已经早上4点了,先睡觉了,撑不住了各位高手有什么办法还请继续指教阿。
      

  9.   

    回复人:sunny1987() ( 一级(初级)) 信誉:100  2007-08-13 11:17:01  得分:0c#区的兄弟们有人建议说不要加查询条件,直接把所有东西select出来,然后再在内存里操作。已经早上4点了,先睡觉了,撑不住了各位高手有什么办法还请继续指教阿。==========================================
    4 点了??????钟没有错吧,发帖时是上午 11:17。
      

  10.   

    我用的是mysql数据库,有人建议说把表的类型从默认的B-tree改成Hash会好一点,不知道可不可行。因为我测试起来不是很方便,现有的数据暂时不想请空
      

  11.   

    如果是没有返回类型的情况,可以用下批处理
    在你的循环里
    {
    ...
    ps.setInt(1,me.getKey());
    ps.addBath();
    }
    最后提交
    ps.executeBath();
    ...
    对于查寻,因为要返回只能考虑下连接池了,oracle...
      

  12.   

    c#区的兄弟们有人建议说不要加查询条件,直接把所有东西select出来,然后再在内存里操作。
    这位兄弟说的也对,用空间换时间!
      

  13.   

    是否考虑过将一定数据先放到resultset(或者其他的)
    然后再一起插入?