java – Ibatis startBatch()仅适用于SqlMapClient自己的启动和提交事务,而不适用于Spring管理的事务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Ibatis startBatch()仅适用于SqlMapClient自己的启动和提交事务,而不适用于Spring管理的事务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2361字,纯文字阅读大概需要4分钟。
内容图文
![java – Ibatis startBatch()仅适用于SqlMapClient自己的启动和提交事务,而不适用于Spring管理的事务](/upload/InfoBanner/zyjiaocheng/903/11665fc46f804c5a9a7bb833beb5153e.jpg)
我发现即使我有Spring事务包装的代码,并且它在我期望的时候提交/回滚,为了在使用Ibatis和Spring时使用JDBC批处理,我需要使用显式的SqlMapClient事务方法.
即这按照我的预期进行批处理:
dao.getSqlMapClient().startTransaction();
dao.getSqlMapClient().startBatch();
int i = 0;
for (MyObject obj : allObjects)
{
dao.storeChange(obj);
i++;
if (i % DB_BATCH_SIZE == 0)
{
dao.getSqlMapClient().executeBatch();
dao.getSqlMapClient().startBatch();
}
}
dao.getSqlMapClient().executeBatch();
dao.getSqlMapClient().commitTransaction();
但是如果我没有开启和关闭事务语句,并依靠Spring来管理事物(这就是我想做的事情!),批处理就不会发生.
鉴于Spring似乎在交易管理方面处理其讨价还价的一方,有人可以就此处的任何已知问题提出建议吗?
(数据库是MySQL;我知道有关其INSERT语句重写的JDBC伪批处理方法的问题,这绝对不是问题)
解决方法:
通过阅读各种资源和反复试验找到了这个背后的原因,我在这里记录了我们的结果,因为它可以帮助其他人.
事实证明,不同的行为是由于我们的DAO类扩展了Spring的SqlMapClientTemplate.在那个班级,你有两个“选择”(我说选择;一个是正确的,一个不是):
>直接使用insert(),update()等;一直使用完整的Spring对象
> getSqlMapClient().insert(),update()等;这个实际上使用getSqlMapClient()返回的com.ibatis …对象,而不是Spring
两者通常都有效,但从我的阅读中可以看出第一个选项更好,例如如果你正在使用Spring,你想要完全基于Spring,而不是“跳出”到Ibatis对象.
现在,SqlMapClientTemplate不直接提供对startBatch()/ executeBatch()的访问,只是方便的insert(),update()东西,所以这样的代码是必要的.下面的代码完全适用于我们的Spring托管事务,而不是显式代码startTransaction().
(免责声明这可能包含由于我的“匿名”工作代码而导致的错误)
public class MyFunkyDao extends SqlMapClientDaoSupport
{
private static final int DB_BATCH_SIZE = 1000;
public void storeMyData(final List<MyData> listData)
{
getSqlMapClientTemplate().execute( new SqlMapClientCallback()
{
@Override
public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException
{
int count = 0, total = 0;
Map<String, Object> params = new HashMap<String, Object>();
executor.startBatch();
for (MyData data: listData)
{
params.put("param name 1", data.getValue());
executor.insert("insertData", params);
count++;
if (count % DB_BATCH_SIZE == 0)
{
total += executor.executeBatch();
executor.startBatch();
}
params.clear();
}
total += executor.executeBatch();
return new Integer(total);
}
});
}
}
内容总结
以上是互联网集市为您收集整理的java – Ibatis startBatch()仅适用于SqlMapClient自己的启动和提交事务,而不适用于Spring管理的事务全部内容,希望文章能够帮你解决java – Ibatis startBatch()仅适用于SqlMapClient自己的启动和提交事务,而不适用于Spring管理的事务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。