| 发表于:2008-01-17 13:42:40 楼主 |
最近考虑到优化数据导入这块,所以看看通过batch这块内容有没有改进的余地。 但是加入startbatch(),EXECutebatch(),感觉没有什么效果。 下面是我测试时候的概略情况: mastsvr这个service方法已注册,同时已注入sqlmapdao,dao是接口 mastsvr.adddata(){ //获取goodslist 商品列表, banklist 部门列表 ....... //对每个商品id和部门id分别插入一条 记录到mast表中 dao.insertbunataxbatlst(goodslist, banklist); } sqlmapdao中: public void insertbunataxbatlst( final list goodslist, final list banklist { getsqlmapclienttemplate().EXECute(new sqlmapclientcallback() { public object doinsqlmapclient(sqlmapEXECutor EXECutor) throws sqlexception { EXECutor.startbatch(); // getsqlmapclienttemplate().getsqlmapclient().getdatasource().getconnection().setautocommit( true ); system.out.println("当前事物状态: " + getsqlmapclienttemplate().getsqlmapclient().getdatasource().getconnection().getautocommit() ); // do some ibatis operations here for(int j= 0 ;j < goodslist.size();j++){ olygoods olygoods = (olygoods)goodslist.get(j); mast mast = new mast(); mast.setgoodsid(olygoods.getgoodsid()); for (int i = 0; i < banklist.size(); i++) { mast.setdeptid( ""+((bank) banklist.get(i)).getbankid() ); mast.setinnum(new long(0)); mast.setoranum(new long(0)); mast.setoutnum(new long(0)); mast.setrepayamt(new bigdecimal(0)); mast.setreturnnum(new long(0)); mast.setsalenum(new long(0)); mast.setstocknum(new long(0)); mast.setsubreturnnum(new long(0)); mast.setwaitinnum(new long(0)); insertbysql( "oly_mast_goods.addmastgoods", mast); } } EXECutor.EXECutebatch(); return null; } }); } junit测试结果是: 6248记录,batch 加上和不加上差不多,基本都是18s左右。 问题1:查询网上文章,说jdbc的autocommit属性默认被设置为true的,但是我打印出来为false(而且设置没用,我用 getsqlmapclienttemplate().getsqlmapclient().getdatasource().getconnection().setautocommit( true );或配置文件里加 <property name="defaultautocommit"> <value> true </value> </property> 这些方法也没有用,始终是false),但如果把adddata()方法改名,让其得不到事务处理,打印出来就是true,设置就有用了,是不是事务处理时自动将autocommit设置为false了? 问题2:如何真正发挥batch的作用 |
|
|
|
|