在进行开发时,避免不了要批理更新一些数据,这时候,Hibernate+Spring 要怎么做比较好
执行速度快,性能优

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【Robin_M】截止到2008-07-28 10:16:43的历史汇总数据(不包括此帖):
    发帖的总数量:18                       发帖的总分数:470                      每贴平均分数:26                       
    回帖的总数量:20                       得分贴总数量:1                        回帖的得分率:5%                       
    结贴的总数量:18                       结贴的总分数:470                      
    无满意结贴数:9                        无满意结贴分:350                      
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:50.00 %               无满意结分率:74.47 %                  
    敬礼!
      

  2.   

    可以通过HQL实现,不过要考虑缓存,批量更新对缓存影响大,会造成缓存不同步
    也可以通过getJdbcTemplate().batchUpdate(sql, setter);   
      

  3.   

    hibernate的批量插入(Batch inserts)
    如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。 Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
       
    for ( int i=0; i<100000; i++ ) {
        Customer customer = new Customer(.....);
        session.save(customer);
        if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,与JDBC批量设置相同
            //flush a batch of inserts and release memory:
            //将本批插入的对象立即写入数据库并释放内存
            session.flush();
            session.clear();
        }
    }
       
    tx.commit();
    session.close();
      

  4.   

    jdbctemplate 实现批量更新操作
    1.public int[] updatePerson(final String[] ids)   
        {   
            String sql ="update person set address=? where id=?";   
            BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter(){   
                public void setValues(PreparedStatement ps,int i) throws SQLException{   
                   ps.setString(1, "[email protected]");   
                   ps.setInt(2, Integer.parseInt(ids[i]));   
                  }   
                  public int getBatchSize(){   
                     return ids.length;   
                  }   
            };   
            return this.getJdbcTemplate().batchUpdate(sql, setter);   
        }  2.重载PreparedStatementCreator
    public void insertUsers(User ur)   
        {   
             this.getJdbcTemplate().update(new PreparedStatementCreator()   
            {   
                public PreparedStatement createPreparedStatement(Connection con) throws SQLException   
                {   
                    String sql = "insert into user (name,age) values(?,?)";   
                    PreparedStatement ps = con.prepareStatement(sql);   
                    ps.setString(1,"");   
                    ps.setInt(2,0);   
                    return ps;   
                }   
            });   
        }  
    3.直接写SQL
    jdbcTemplate.update("insert into user (name,age) "+"values (' " + name + " ',  " +age +")");