0

私のプロジェクトでは、ネストされたオブジェクトが多数あり、数日後にサーバーはクエリの実行ごとに非常に遅くなります。

object.save(flush:true) から flush:true を削除しました。これにより、オブジェクトがデータベースにすぐに永続化されるのを回避する必要があります。専念。

しかし、この後でも、db でデッドロック関連の問題が発生し、エラーが発生します。

    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

問題をさらに掘り下げた後、数回実行した後、休止状態セッションを手動でフラッシュする必要があると提案する人もいます。

セーブコールからオブジェクトフラッシュを削除したので、行くべきですか

session.flush()
session.clear()

休止状態のセッションをクリアするには、はいの場合、これら 2 つの側面の違いは何ですか。

4

1 に答える 1

1

接続リークがあるか、開いている接続の最大数を調整する必要があるようです。これは、 のpropertiesブロックで構成可能DataSource.groovyです。

しかし、フラッシングに関する質問に答えると、違いはありません。単一のオブジェクトをフラッシュすることはできません。Hibernate はキャッシュされたすべての変更をフラッシュします。save(flush:true)は便利な呼び出し方法でsave()あり、session.flush()

于 2013-05-31T11:30:05.750 に答える