程序思路:通过遍历一个collection(collection里面装载的是不定数的WmsFundPrice 对象,每个WmsFundPrice 对象对应一条数据表纪录),实现对collection中所有的对象进行批量插入,可是当collection中有170个对象这样时,插入到表中的数据纪录有3000多条...,(呵呵,其实也不知是不是这样调用批插入),后面,我在ps.setString(1,obj1)...ps.setString(17,ojb17)之间都插入ps.addBatch()时,编译没通过,大概是addBatch()有数目限制吧,到了第九个,就说Invalid Batch Value了...哥们代小弟看看这个批量插入到底该如何实现?代码如下:public Object persistenceExcelDatas(Collection c) throws SQLException {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement ps = null;
org.apache.ojb.broker.PersistenceBroker broker = PersistenceBrokerFactory.defaultPersistenceBroker();
String sql = "insert into beacn_usr_prodlist_tmp(product_code,product_type,product_type_desc_en,"+
             "product_type_desc_cn,product_desc_en,product_desc_cn,product_category,product_nature,"+
             "product_risk_level,et_value,et_value_aod,mature_date,sub_form_id,red_form_id,"+
             "updated_time,reason,process_flag,process_time) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,to_date(?,'yyyy-mm-dd hh24:mi:ss'),?,?,?)";

Collection collection = null;
collection = c;
if (null == collection) return new NullObjectException("There is no any data in the CSV file");
boolean autoCommit = false;
try{      
            conn = WmsDBConnUtils.getConnection(broker);
            conn.setAutoCommit(false);
            log.debug("get connection");
            ps = conn.prepareStatement(sql); 
            for (Iterator iter = collection.iterator(); iter.hasNext();){
             WmsFundPrice wf = (WmsFundPrice)iter.next();                     
             ps.setString(1, wf.getProdCode());
             ps.setString(2, wf.getProdType());
             ps.setString(3, wf.getProdTypeDescEN());
             ps.setString(4, wf.getProdTypeDescCH());
             ps.setString(5, wf.getProdDescEN());
             ps.setString(6, wf.getProdDescCN());
             ps.setString(7, wf.getProdCategory());
             ps.setString(8, wf.getProdNature());
             ps.setString(9, wf.getProdRskLvl());
             ps.setString(10, wf.getMarketValue());
             ps.setString(11, wf.getMarketValueAOD());
             ps.setString(12, wf.getMatureDate());
             ps.setString(13, wf.getSubscriFormID());
             ps.setString(14, wf.getRedempFormID());
             ps.setString(15, wf.getUpdatedTime());
             ps.setString(16, wf.getReason());
             ps.setString(17, wf.getProcessFlag());
             ps.setString(18, wf.getProcessTime());
             ps.addBatch();            
            }
            //ps.executeUpdate();
            ps.executeBatch();
            conn.commit();
            log.debug("trsaction has committed");
}catch (SQLException ex) {
            log.error(ex, ex);   
            ex.printStackTrace();
        }catch (NumberFormatException nex){

解决方案 »

  1.   

    可是当collection中有170个对象这样时,插入到表中的数据纪录有3000多条...,(
    为什么不用数据持久化技术,用Hibernate来做,呀,,这样有170个对象就只用与数据库交互170次,每个对象做一次,,
    要是自己做的东西,,我个人觉得把,,用Hibernate做把
      

  2.   

    不清楚你的连接是怎么实现的,建议你看一下WmsDBConnUtils.getConnection(broker)这个方法。还有就是找找org.apache.ojb.broker.PersistenceBroker的文档看看是否对批处理有特别的设置。