Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate session.flush()和grailsObject.save(flush:true)在数据库上执行查询的差异_Grails - Fatal编程技术网

Hibernate session.flush()和grailsObject.save(flush:true)在数据库上执行查询的差异

Hibernate session.flush()和grailsObject.save(flush:true)在数据库上执行查询的差异,grails,Grails,在我的项目中,我有很多嵌套对象,几天后,服务器在执行每个查询时都变得非常慢 我已经从object.save(flush:true)中删除了flush:true,这将避免对象立即被持久化到数据库中,因为我不需要对象id,我认为最好让hibernate决定何时刷新和提交 但即使在这之后,我也会遇到一些与数据库死锁相关的问题,我会遇到错误: Timeout waiting for idle object. Stacktrace follows: org.springframework.tra

在我的项目中,我有很多嵌套对象,几天后,服务器在执行每个查询时都变得非常慢

我已经从object.save(flush:true)中删除了flush:true,这将避免对象立即被持久化到数据库中,因为我不需要对象id,我认为最好让hibernate决定何时刷新和提交

但即使在这之后,我也会遇到一些与数据库死锁相关的问题,我会遇到错误:

    Timeout waiting for idle object. Stacktrace follows:

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC beg

in failed:

        at SecurityFilters$_closure1_closure2_closure4.doCall(SecurityFilters.groovy:13)

        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

        at java.lang.Thread.run(Thread.java:662)

Caused by: org.hibernate.TransactionException: JDBC begin failed:

        ... 4 more

Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114)

        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

        ... 4 more

Caused by: java.util.NoSuchElementException: Timeout waiting for idle object

        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1167)

        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)

        ... 5 more
在深入研究这个问题之后,有人建议在执行几次之后,我应该手动刷新hibernate会话

由于我已经从保存调用中删除了对象刷新,我应该继续吗

session.flush()
session.clear()

要清除hibernate会话,如果是,那么这两个方面有什么区别。

看起来您有连接泄漏,或者您需要调整最大打开连接数。这可以在
DataSource.groovy
中的
properties
块中配置


但要回答你关于法拉盛的问题,没有区别。不能刷新单个对象-Hibernate刷新所有缓存的更改
save(flush:true)
只是调用
save()
然后调用
session.flush()

的一种方便方法。我们正在使用MSSQL数据库。谢谢Burt,我将检查数据库连接属性还有一件事,您认为上面的错误可能是由代码中的死锁引起的吗?因为这就是我试图释放一些资源的原因。这是一个很好的理论——你有足够大的连接池,但你偶尔会保持连接太长。