【问题标题】:spring ibatis mysql intermittent asynchronous problemspring ibatis mysql间歇性异步问题
【发布时间】:2010-12-15 20:38:21
【问题描述】:

我在spring用ibatis写mysql。

我有一个间歇性错误。在进程的每个循环中,我将两行写入数据库。下一个周期我从上一个周期的行中读取。有时(30 次中的一次,有时更频繁,有时更少)我只从数据库中取回一行。

我已经关闭了所有我能想到的缓存。我的 sqlmap-config.xml 只是说:

<sqlMapConfig>
<settings enhancementEnabled="false" statementCachingEnabled="false" classInfoCacheEnabled="false"/>

<sqlMap resource="ibatis/model/cognitura_core.xml"/>

是否有一些异步,或者缓存到我缺少的 spring 或 ibatis 或 mysql 驱动程序?

使用spring 3.0.5、mybatis 2.3.5、mysql-connector-java 5.0.5

编辑 1:

可能是因为我使用的是连接池 (c3p0)?当我阅读时,插入是否可能仍在运行。不过,这很奇怪,我认为除非我明确声明异步,否则一切都会同步发生?

【问题讨论】:

    标签: java mysql spring ibatis mybatis


    【解决方案1】:

    你是在插入之后调用 SqlSession.commit() 吗? C3P0 异步“关闭”连接,这可能在幕后调用 commit。这可以解释您所看到的行为。

    【讨论】:

    • 感谢您的建议。这听起来很有希望.. 我不确定你所说的 SqlSession.commit() 是什么意思。我这样调用插入 getSqlMapClientTemplate().insert("insertIterationHistory",dataMap); - 模板似乎没有提交方法。我应该只用@Transaction 注释该方法吗?我想我真的不明白提交应该在哪里发生。我认为默认情况下每个插入都会自动提交..
    • 嗯.. 我刚刚读到old.nabble.com/how-to-dusable-asynch-threads---td21196742.html 为您的异步解释增加了权重。我想我只是要使用一个不同的连接池来同步做事情..
    • 对不起,误读为MyBatis 3。原理是一样的。您需要一个事务来获取数据库提交,因此添加注释应该可以工作,假设您配置了 DataSourceTransactionManager 并且在 Spring 配置中有类似 的内容。
    【解决方案2】:

    我遇到了类似的行为。这就是我正在做的事情。我有一个旧版本的 IBATIS,我不打算升级。您可以轻松地将其移动到装饰器中。

    SqlMapSession session = client.openSession();
    try {
        try {
            session.startTransaction();
            // do work
            session.commitTransaction();
            // The transaction should be committed now, but it doesn't always happen.
            session.getCurrentConnection().commit(); // Commit again :/
        } finally {
            session.endTransaction();
        }
    } finally {
        session.close(); // would be nice if it was 'AutoCloseable'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多