数据源,我把defaultAutoCommit设成了false
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="defaultAutoCommit" value="false"></property>
</bean><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:SqlMapConfig.xml</value>
</property>
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>类里面,是继承SqlMapClientDaoSupport 这个。
public class UserDao extends SqlMapClientDaoSupport implements IUserDao {
   public void save(){
SqlMapClient sqlMap=getSqlMapClientTemplate().getSqlMapClient();sqlMap.startTransaction();
sqlMap.startBatch();for(int i = 0 ;i<list.size();i++){
getSqlMapClientTemplate().insert("User.save",userphone.get(i).toString());
 if((i+1)%200==0){
sqlMap.executeBatch();
sqlMap.startBatch();
 }
}sqlMap.executeBatch();
sqlMap.startBatch();
sqlMap.commitTransaction();
sqlMap.endTransaction();
}这样写的,批处理根本没有一点效果啊怎么办呢。

解决方案 »

  1.   

          public void batchInsert(final List<T> list){
         if (list==null){return;}   
            SqlMapClientCallback callback = new SqlMapClientCallback() {          
                public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {              
                    executor.startBatch();              
                    for (T member : list) {                  
                        executor.insert(sqlmapNamespace + "." + SQLID_INSERT, member);              
                    }              
                    executor.executeBatch();              
                    return null;          
                }      
            };      
            this.getSqlMapClientTemplate().execute(callback);      
        } 
      

  2.   

    APOLLO_TS 大哥你的方法,可用,但不知道为何要这样写?还有一个问题,就是我现在用的是dbcp,如果换成C3P0,一样的就不行了。如何换成c3p0后,批处理能成功。
      

  3.   

    http://blog.csdn.net/apollo_ts/category/596195.aspxc3p0只是连接资源,毫无关系!
      

  4.   

    还有。
    SqlMapClientCallback callback = new SqlMapClientCallback() {          
                public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {              
                    executor.startBatch();              
                    for (T member : list) {                  
                        executor.insert(sqlmapNamespace + "." + SQLID_INSERT, member);              
                    }              
                    executor.executeBatch();              
                    return null;          
                }      
            };      
    连接确实是我配错了,不管连接的事情。
    还有一个问题 是 这个能有返回值吗、、十分感谢!
      

  5.   

    有没有返回值就看你编程功底了!但是多半也没用!如果有用证明有关联插入。况且批量插入你返回那一个呢?可以在执行批量插入后执行!一个SELECT LAST_INSERT_ID()  查询就返回最后一个递增主键项了。
      

  6.   

    好了,可以返回值了。。不过有个新的问题。ibatis 执行 create table的<statement id="createTabel">
    <![CDATA[
    create table #tempuserphone (userphone varchar(50))
    ]]>
    </statement>初始化出错应该怎么写??然后getSqlMapClientTemplate() 用什么方法来调用再次感谢。。谢谢。
      

  7.   

    喔,我自己答了。
    create table ##temptablename (userphone varchar(50)) 
    这样是可以的。
    执行出来的语句是create table #temptablename (userphone varchar(50))不过sql server #temptablename 是局部临时表,全局的 "##temptablename"怎么建呢??还有然后getSqlMapClientTemplate() 用什么方法来调用我随便用了一个insert不知statement create 或者 drop  应该用什么来调。。谢谢