hibernate - Grails-非空属性仅对并发用户引用空值或瞬时值错误

标签 hibernate grails gorm

我们在Grails中开发的Web应用程序最近进入了压力测试阶段,现在我们遇到的问题似乎只有在多个用户(不同用户帐户)同时执行相同操作时才会发生。这些 Action 是事务性的,但是它们都不在同一对象上执行(正在创建新对象)。我们得到的异常(exception)是:

Class: org.hibernate.PropertyValueException Message: not-null property references a null or transient value: xxx.xxx.xxx.domains.PathSections._PathViews_sectionsBackref



这通常是异常的样子,并对涉及的域类进行了一些更改。更糟的是,当发生此错误时,涉及列表的所有其他事务操作都会导致相同的错误(不同的域类),无论是否同时进行。然后需要重新启动服务器以临时修复它。以下是相关 Realm 类的一些摘要:
class PathViews extends View{

static constraints = {
    molreports(nullable:true)
    molorders(nullable:true)
    otherreports(nullable: true)
    sections(nullable:true)
    addendum(nullable:true)
    images(nullable:true)
    edits(nullable:true)
}

List sections
List otherreports
List molreports
List molorders
List images
PathEdits edits
PathSections addendum
int headings
String accid

static auditable = true

static hasMany = [sections: PathSections, otherreports: PathSections, molorders:MolecularOrder, molreports: MolecularReport, images: PathLocalImage]

static mappedBy = [sections: 'pathviews', otherreports: 'reports']


class PathSections extends Sections {

static constraints = {
    pathviews(nullable:true)
    reports(nullable:true)
}


static auditable = true

static belongsTo =  [pathviews: PathViews, reports: PathViews]

}

我认为一开始起作用的临时解决方法是使大多数事务服务方法同步。这似乎使错误变得更加随机且难以再现。我还仔细检查了其他事情,例如确保hasMany关系的子对象在添加到父对象之前没有显式保存,并使用domainClass.lock(id)而不是domainClass.get(id)。仅一个用户使用该应用程序时,根本不会发生此问题。

使用的版本:

Grails: 2.3.7 Hibernate: 3.6.10.10



非常感谢您提供任何帮助,因为我现在马上就要拔掉头发上剩下的任何东西,如果需要更多信息,请告诉我。

谢谢!
肖恩。

最佳答案

您应该做的第一件事是在相同的次要版本2.3.11中升级到最新版本。它不太可能提供帮助,但您可能会很幸运。

集合是棘手的,因为它们被视为拥有的域类的属性,但是被表示为多个数据库记录。因此,您会产生有趣的效果,例如无法正确锁定更新实例。给定“作者有很多书”,如果您显式锁定作者实例,则生成的SQL类似于select ... from author for update where id=?。但是您不能锁定书籍,如果可以并且馆藏更大,您是否想锁定一百万个馆藏实例?因此,在子实例在顶级实例之间共享时,甚至在与同步请求重叠的Ajax请求之间共享时,您不可避免地会遇到多对多的并发问题。

这仅仅是数据的正确性-使用集合在GORM中进行持久化的潜在性能成本非常高。我4年前做的This talk现在和现在一样放松,它演示了1对多对多的性能问题,并显示了不使用集合且不受这些问题影响的代码。您确实需要做更多的工作,但是我认为这是一个很小的代价。

关于hibernate - Grails-非空属性仅对并发用户引用空值或瞬时值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26569429/

相关文章:

java - 从Migrate迁移到Spring MVC 4 + Hibernate5

java - 测试环境中的JPA @PrePersist

grails - 手动向 Spring Security 提供引用 URL

sql-server - Grails 3-使用SQL Server地理类型?

hibernate - Grails/GORM延迟加载CLOB字段

java - Hibernate连接3个表

java - 多对一关系的无限递归错误

rest - Grails列出 Restful 资源返回意外结果

grails - 无法使用AST转换将方法添加到GORM对象

grails - 指定候选关键字?