DLFileRankを有効にした場合、DLFileRankの更新によりDeadlockやSQL Update Batch Errorが発生することがある。
DLFileRankを使用する場合、データベースへの書き込みが多いため、ユニークな制約が見つかることがあります。 多くの場合、一括更新の問題を引き起こしている制約を調べてみることが有効です。 これらのエラーは、コンテンツが閲覧されるたびに、データベースを更新して、あるサイトに対して最近ダウンロードされたドキュメントを書き込むために発生します。 DLFileRankでは、いくつかの小さな読み込み、一括読み込み、そしてエントリーを1つずつ急速に削除しようとする書き込みがあります。 そのため、クラスタリングが加わると、この問題は確実に大きくなります。
以下は、デッドロックが発生していた時のスタックトレーススニペットの例です:
2019-06-10 15:32:54.498 ERROR [ajp-nio-8009-exec-678][JDBCExceptionReporter:234]
Transaction (Process ID 487) was deadlocked on lock | thread resources with another
process and has been chosen as the deadlock victim. Rerun the transaction.
2019-06-10 15:32:54.498 ERROR
[ajp-nio-8009-exec-678][TransactionCommitCallbackUtil:46] Unable to execute transaction
commit callback
com.liferay.portal.kernel.exception.SystemException:
com.liferay.portal.kernel.dao.orm.ORMException:
org.hibernate.exception.LockAcquisitionException: could not execute query
at
com.liferay.portal.kernel.service.persistence.impl.BasePersistenceImpl.processException(BasePersistenceImpl.java:269)
at
com.liferay.document.library.file.rank.service.persistence.impl.DLFileRankPersistenceImpl.fetchByC_U_F(DLFileRankPersistenceImpl.java:2280)
at
com.liferay.document.library.file.rank.service.persistence.impl.DLFileRankPersistenceImpl.fetchByC_U_F(DLFileRankPersistenceImpl.java:2190)
at
com.liferay.document.library.file.rank.service.impl.DLFileRankLocalServiceImpl.updateFileRank(DLFileRankLocalServiceImpl.java:200)
at sun.reflect.GeneratedMethodAccessor880.invoke(Unknown Source)
...
at
com.liferay.document.library.internal.service.DLFileRankDLAppHelperLocalServiceWrapper.lambda$getFileAsStream$0(DLFileRankDLAppHelperLocalServiceWrapper.java:74)
...
Caused by: com.liferay.portal.kernel.dao.orm.ORMException:
org.hibernate.exception.LockAcquisitionException: could not execute query
...
at
com.liferay.document.library.file.rank.service.persistence.impl.DLFileRankPersistenceImpl.f
etchByC_U_F(DLFileRankPersistenceImpl.java:2252)
... 106 more
Caused by: org.hibernate.exception.LockAcquisitionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:107)
…..
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 487)
was deadlocked on lock | thread resources with another process and has been chosen as
the deadlock victim. Rerun the transaction.
...
解像度
この場合、提案としては、DLFileRankがプロジェクトに必要ない場合は、OFFにすることでデータベースのパフォーマンスを向上させることができます。
バージョン 6.0.x, 6.1.x, 6.2.x, DXP 7.0 では、DLFileRank はこのプロパティでオフにすることができます: dl.file.rank.enabled=false
DXP 7.1.xでは、DLFileRankのサービスやモデルが独立したモジュールでOSGiサービスに抽出されました(LPS-74888)。 ファイルランクを無効にするためには、モジュール document-library-file-rank-service を無効化する必要があります:
DLFileRank を一時的に無効にする場合 (osgi/state を削除してサーバーを再起動すると、モジュールは再び起動します).
- Gogoshell(コントロールパネル -> 設定 -> Gogoshell)へアクセスします。
-
ss| grep "com.liferay.document.library.file.rank.service" を実行すると、以下のような出力になるはずです:
g! ss| grep "com.liferay.document.library.file.rank.service" 304 ACTIVE com.liferay.document.library.file.rank.service_1.0.12
- 実行する 停止する 304.
-
ss| grep "com.liferay.document.library.file.rank.service" を実行すると、以下のような出力になるはずです:(ステータスは解決済み)
g! ss| grep "com.liferay.document.library.file.rank.service" 304 RESOLVED com.liferay.document.library.file.rank.service_1.0.12
DLFileRankを永久に無効にする方法: (モジュールをブラックリストに登録することで)。
- コントロールパネルから「設定」→「システム設定」→「モジュールコンテナ」に移動します。
- バンドルブラックリスト画面で、バンドルシンボル名「com.liferay.document.library.file.rank.service」を追加します。 -> 更新しました。
- ログに以下のメッセージが表示されます:
2019-06-11 02:56:54.476 INFO [CM Event Dispatcher (Fire
ConfigurationEvent:
pid=com.liferay.portal.bundle.blacklist.internal.BundleBlacklistConfigur
ation)][BundleBlacklist:188] Stopping blacklisted bundle
com.liferay.document.library.file.rank.service_1.0.12 [304]
2019-06-11 02:56:54.571 INFO [CM Event Dispatcher (Fire
ConfigurationEvent:
pid=com.liferay.portal.bundle.blacklist.internal.BundleBlacklistConfigur
ation)][BundleStartStopLogger:42] STOPPED
com.liferay.document.library.file.rank.service_1.0.12 [304]
追加情報
文書にアクセスする人が多ければ多いほど、データベースへの書き込みの数が多くなるため、このエラーが発生する可能性が高くなります。 そのため、サイトの潜在的な帯域幅を考慮する必要があります。