hibernate - 在同步方法中使用 Grails 重复记录

标签 hibernate session grails synchronization findby

我花了整个晚上试图弄清楚,此时我很绝望。
我的 Grails 2.1.0 项目中有服务类。它对 Web 服务执行查询 - 查询是线程化的。一旦线程得到它调用的数据synchronized方法WriteToDB ,它又取一个名称( String field )并通过 findByName 检查域.如果记录存在,则不执行任何其他操作来创建新记录。

现在我检查了方法确实只允许一次调用一个线程,这里是日志示例:

Error 2013-01-02 21:29:47,408 [Thread-21] ERROR - WriteToDB START

Error 2013-01-02 21:29:47,474 [Thread-21] ERROR - WriteToDB FINISHED

Error 2013-01-02 21:29:47,475 [Thread-20] ERROR - WriteToDB START

Error 2013-01-02 21:29:47,571 [Thread-20] ERROR - WriteToDB FINISHED

Error 2013-01-02 21:29:47,581 [Thread-49] ERROR - WriteToDB START

Error 2013-01-02 21:29:47,866 [Thread-49] ERROR - WriteToDB FINISHED

Error 2013-01-02 21:29:47,867 [Thread-45] ERROR - WriteToDB START

Error 2013-01-02 21:29:48,202 [Thread-45] ERROR - WriteToDB FINISHED

Error 2013-01-02 21:29:48,203 [Thread-48] ERROR - WriteToDB START

Error 2013-01-02 21:29:48,320 [Thread-48] ERROR - WriteToDB FINISHED



但是,我得到重复的记录!!!每次我保存新记录时,我都会做 flush:true在上面。我不明白为什么它一直在发生?我手动测试 - 在测试之前将一条已知记录添加到数据库中,并且它从未被复制,但是,正在保存的新记录最多被复制 6 次。

请帮忙。我需要索引一些东西吗?或者以特殊的方式冲洗一些东西?为什么会这样?

[2013 年 2 月 1 日更新] :

这是我用来保存记录的代码:
      if(!f) { // Check if record doesn't exist then save, else nothing
          f = new Feature(name: featureName)
          if( !f.save(flush: true) ) {
              f.errors.each {
                  log.error it
              }
          }
      }

还有错误示例:

Error 2013-01-02 22:25:58,868 [Thread-20] ERROR util.JDBCExceptionReporter - Duplicate entry 'Automatic transmission' for key 'name'

Error 2013-01-02 22:25:58,873 [Thread-20] ERROR hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) Message: null id in Project2.Feature entry (don't flush the Session after an exception occurs)



我可以这样解释(我在“保存”部分代码之前得到了 FindByName):
我查找记录,但它不存在,所以我正在创建它,现在它提示重复条目,我得到变量“f”的空值,后来我将它作为关系插入到另一个表中。

我想我可能会尝试使用 try catch block 修复此代码......想法?

最佳答案

好的,经过一些测试和研究,我发现了一个问题。
Domain.save(flush:true) - 由于线程而无法工作。

这是我的线程创建示例:

Thread.start {
    Domain.withTransaction {
         // Doing stuff and calling synchronization method to write data to DB
    }
}

修复在这里找到:Grails, GPars and data persistence

我替换了Domain.withTransactionDomain.withNewSession :
Thread.start {
    Domain.withNewSession {
         // Doing stuff and calling synchronization method to write data to DB
    }
}

save(flush: true)开始写入 mySQL。由于数据被写入 mySQL,findBy... 开始返回正确的结果,因此我的应用程序不再尝试创建重复记录。问题解决了!

谢谢吴金兆,您的建议帮了大忙!

关于hibernate - 在同步方法中使用 Grails 重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132367/

相关文章:

java.lang.ClassNotFoundException : org. springframework.cglib.core.CodeGenerationException

php - 如何检查 PHP session 是否为空?

java - 如何避免 hibernate 插入空字符串到我的字段?

java - 将 SXSSFWorkbook 保存到 blob 的最佳方法?

PHP session 超时

grails - Groovy确定字节数组编码

grails - grails View 中未显示“dateCreated”字段

grails - 使用sudo以其他用户身份安装grails

java - 如何在hibernate中更新父表的主键,从而自动更新子表的外键?

javascript - 创建一个只能从 JS 访问的 cookie,并且不会随每个请求一起发送/