Jira Server または Data Center が低速で、複数のコネクションの危険な使用によるエラーがログに記録される
プラットフォームについて: Server および Data Center のみ。この記事は、Server および Data Center プラットフォームのアトラシアン製品にのみ適用されます。
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
問題
Jira アプリケーションが、利用負荷が高いときに低速になる
診断
Jira 5.0.3 以降をご利用の場合、Jira アプリケーション内でコネクション プールを監視できます。メニューの歯車アイコン > [システム] > [データベース監視] に移動すると、直近 6 時間のコネクション プールの統計情報のグラフが表示されます。
アクティブなコネクションの数がプール内の最大コネクション数に常に一致しているかそれに近い場合 (グラフのスケールは利用可能なコネクションの最大数です。上記例では 20)、Jira がプール枯渇状態になっていることがわかります。
atlassian-jira.log
に次の行が記録される場合があります。
2016-03-11 08:40:40,409 Caesium-1-2 WARN anonymous [c.a.jira.ofbiz.ConnectionPoolHealthSqlInterceptor] Dangerous use of multiple connections: taken => count=3; marks=[2-3]; pool=2/20
2016-03-11 08:40:40,409 Caesium-1-2 WARN anonymous [c.a.jira.ofbiz.ConnectionPoolHealthSqlInterceptor] Dangerous use of multiple connections: replaced => count=2; marks=[1-3]; pool=1/20
2016-03-11 08:40:40,409 Caesium-1-2 WARN anonymous [c.a.jira.ofbiz.ConnectionPoolHealthSqlInterceptor] Dangerous use of multiple connections: replaced => count=1; marks=[0-3]; pool=0/20
2016-03-11 08:40:40,409 Caesium-1-2 WARN anonymous [c.a.jira.ofbiz.ConnectionPoolHealthSqlInterceptor] Dangerous use of multiple connections: replaced => count=0; marks=[-1-3]; pool=-1/20
Jira 5.0.3 よりも前のバージョンを利用している場合、このような挙動を確認する最適な方法はスレッド ダンプの生成です。以降は、この問題を示すスレッド ダンプのスニペット例です。
"Thread-4" prio=6 tid=0x16d85988 nid=0xe20 in Object.wait() [0x17d9f000..0x17d9fce8]
at java.lang.Object.wait(Native Method)
- waiting on <0x04139d18> (a org.apache.tomcat.dbcp.pool.impl.GenericObjectPool)
at java.lang.Object.wait(Object.java:474)
at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:748)
- locked <0x04139d18> (a org.apache.tomcat.dbcp.pool.impl.GenericObjectPool)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at org.ofbiz.core.entity.transaction.JNDIFactory.getJndiConnection(JNDIFactory.java:168)
at org.ofbiz.core.entity.transaction.JNDIFactory.getConnection(JNDIFactory.java:140)
at org.ofbiz.core.entity.TransactionFactory.getConnection(TransactionFactory.java:99)
at org.ofbiz.core.entity.ConnectionFactory.getConnection(ConnectionFactory.java:53)
at com.atlassian.jira.upgrade.ConnectionKeeper.openConnections(ConnectionKeeper.java:106)
at com.atlassian.jira.upgrade.ConnectionKeeper.run(ConnectionKeeper.java:87)
この問題を示す行は次のものです。
- locked <0x04139d18> (a org.apache.tomcat.dbcp.pool.impl.GenericObjectPool)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
原因
Jira アプリケーションに設定されたコネクション プールのデフォルト値は 20 で、通常の利用であればこれで十分です。インストールされたユーザー プラグイン数が、利用されるデータベース コネクションの数に影響し、それによってプール サイズを増やす必要があります。
ソリューション
Jira 5.1 以降
Jira 設定ツールを使うか dbconfig.xml
を編集して、コネクション プールの最大コネクション数を増やします。Maximum Size
のパラメーターを増やします。「Jira をデータベースに接続する」で指定されているように、対象のデータベース ドキュメントでの定義に従って推奨される dbconfig.xml
を利用することをおすすめします。
Jira 5.1 - 4.4
dbconfig.xml
を編集して pool-max-size,
パラメーターを増やします。pool-min-size
and pool-max-idle
dbconfig.xml
の編集の詳細については「Jira をデータベースに接続する」をご確認ください。
Jira 4.4 以前
conf/server.xml
を編集して maxActive
、minIdle
、および maxIdle
パラメーターを増やします。conf/server.xml
の編集の詳細については「Jira をデータベースに接続する」をご確認ください。構成例は次のとおりです。
<Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
username="sa"
password=""
driverClassName="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:${catalina.home}/database/jiradb"
minEvictableIdleTimeMillis="4000"
timeBetweenEvictionRunsMillis="5000"
maxActive="20"
minIdle="4"
maxIdle="8"
/>
これらの値の意味については Apache DBCP のドキュメントをご確認ください。