問題
- サーバーログに
CannotAcquireLockExceptionが何度か表示される:
ERROR [http--10.1.1.133-8080-281][JSONWebServiceServiceAction:97]
org.springframework.dao.CannotAcquireLockException: PreparedStatementCallback;
SQL [INSERT INTO Users_UserGroups (userGroupId, userId) VALUES (?, ?)];
Unknown error 1205; nested exception is java.sql.SQLException: Unknown error 1205
Environment
- ポータル6.2
解決策
-
このエラーがログに表示される場合は、
INSERTクエリを実行するために、データベースがUsers_UserGroupsテーブルのロックを取得できないことを示します。
MySQL がデータベースとして使用され、Users_UserGroups テーブルで多くのSELECTクエリが実行されている場合、データベースはSELECTクエリを優先して実行してからINSERTクエリを実行することができる。
このタイムアウトが MySQL のinnodb_lock_wait_timeoutプロパティで指定された時間を超えた場合、CannotAcquireLockException エラーが発生します。 -
portal-ext.propertiesのtable.mapper.cache.mapping.table.namesプロパティに該当するテーブルを追加することにより、データベース上で実行されるSELECTクエリの数を減らすことができます。この場合、このテーブルに対するクエリはポータルによってキャッシュされます:table.mapper.cache.mapping.table.names=Users_UserGroups
新しい値が適用されるには、ポータルを再起動する必要があります。
追加情報
-
6.2 Fix pack Portal 108で、このプロパティは
table.mapper.cacheless.mapping.table.namesに変更され、デフォルトでは逆の動作、つまりすべてのテーブルがキャッシュされ、このプロパティで指定したテーブルのみがデータベースに対して実行されるようになりました。