gpt4 book ai didi

java - Ibatis startBatch() 仅适用于 SqlMapClient 自己的启动和提交事务,不适用于 Spring 管理的事务

转载 作者:可可西里 更新时间:2023-11-01 07:38:09 24 4
gpt4 key购买 nike

我发现即使我有 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;我知道关于它的 JDBC 伪批处理方法和 INSERT 语句重写的问题,这在这里绝对不是问题)

最佳答案

通过阅读各种资源和反复试验找到了这背后的原因,我在这里记录了我们的结果,因为它可能对其他人有帮助。

事实证明,不同的行为是由于我们的 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);
}
});
}
}

链接:http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/orm/ibatis/SqlMapClientTemplate.html

关于java - Ibatis startBatch() 仅适用于 SqlMapClient 自己的启动和提交事务,不适用于 Spring 管理的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2921840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com