[解決済み] TomcatがremoveAbandonedTimeoutを無視して、プール内の接続をクローズする
質問
tomcat 7.0で、as400上のDB2にJDBC接続し、commonsのdbcpを使用して作業しています。 サーバーに負荷をかけると、設定した30分のremoveAbandonedTimeoutの設定を無視して、すぐにデータベースへの接続を開いたり閉じたりしています。 いくつかの設定を試したのですが、効果がありません。 例えば、15秒間に150のコネクションを開き、140のコネクションを閉じますが、これは明らかな理由ではありません。 このアプリケーションは古いWebSphereサーバーで実行されており、本当にアイドル状態でない限り接続を閉じることはありません。
以下は私の設定です。
<Resource name="MYDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="com.ibm.as400.access.AS400JDBCDriver"
url="jdbc:as400://mydb.na.sysco.net;blockCriteria=2;dateFormat=iso;libraries=*LIBL;naming=system;errors=full"
username="user"
password="pass"
maxActive="350"
maxWait="180000"
minIdle="10"
maxIdle="50"
testWhileIdle="true"
validationQuery="select 1 from sysibm.sysdummy1"
timeBetweenEvictionRunsMillis="34000"
minEvictableIdleTimeMillis="1800000"
removeAbandonedTimeout="1800"
removeAbandoned="true"
logAbandoned="true"/>
システムがアイドル状態のときや、テスト用のアカウントをいくつか持っているだけのときは、予想通りの動作をするのですが、サーバーに負荷をかけると、すぐに大量のオープン、クローズが始まってしまうのです。 例えば、同じ15秒の間に150のコネクションを開き、90のコネクションを閉じます。 私は、監視ソフトウェアから、as400上のQZジョブの開始と終了に関連するソケットのオープンとクローズを読み取っています。 コネクションが使用されている間は、これを継続的に実行します。
これでは、コネクションプールの目的が果たせません。 どんな考えやアイデアでも構いませんので、よろしくお願いします。
また、どのパラメータを最初に使えばいいのかが明確でないため、混乱しています。 TomcatのJDBCコネクションプールパラメータとは一意のcommons dbcpパラメータは、removeAbandonedOnMaintenanceのように、受け入れられません。 しかし、minEvictableIdleTimeMillisのデフォルト値1800000は、Tomcatのjdbcプールパラメータから60000ではなく、拾われます。
https://commons.apache.org/proper/commons-dbcp/api-1.2.2/index.html
https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html
明示的にパラメータを設定しない場合、デフォルトはこのようになります。 tomcat jdbc pool のパラメータがすべてリストアップされ、commons DBCP のパラメータはリストアップされないようです。ただし、minEvictableIdleTimeoutについては、Tomcat JDBC接続プールパラメータの60秒ではなく、DBCPのデフォルトを拾っています。 奇妙なのは、removeAbandonedパラメータがcommons dbcpにはリストされておらず、removeAbandonedOnMaintenanceとremoveAbandonedOnBorrowになっていることです。 私はこの1週間、このジェリーを壁に釘付けにしようとしています。
jmxproxyを使って、リアルタイムに統計や設定を取得しています。
http://myserver:8080/manager/jmxproxy/?qry=Catalina%3Atype%3DDataSource%2C *
Name: Catalina:type=DataSource,class=javax.sql.DataSource,name="EOPDB"
modelerType: org.apache.tomcat.util.modeler.BaseModelMBean
maxIdle: 8
testOnBorrow: false
defaultTransactionIsolation: -1
testOnReturn: false
maxActive: 350
numActive: 104
numTestsPerEvictionRun: 3
minIdle: 0
maxWait: 180000
closed: false
defaultAutoCommit: true
numIdle: 8
validationQueryTimeout: -1
testWhileIdle: false
driverClassName: com.ibm.as400.access.AS400JDBCDriver
accessToUnderlyingConnectionAllowed: false
url: jdbc:as400://mydb;blockCriteria=2;dateFormat=iso;libraries=*LIBL;naming=system;errors=full
removeAbandonedTimeout: 300
defaultReadOnly: false
logAbandoned: false
poolPreparedStatements: false
maxOpenPreparedStatements: -1
removeAbandoned: false
minEvictableIdleTimeMillis: 1800000
timeBetweenEvictionRunsMillis: -1
initialSize: 0
解決方法は?
maxIdleは、プール内でアイドル状態のままにしておける接続の最大数です。アイドル状態の接続数が maxIdle を超えると、アプリケーションによって解放された接続は、接続のアイドル時間を minEvictableIdleTimeMillis と照合せずに即座に閉じられます。
関連
-
[解決済み] tomcatで、catalina_homeとは何ですか、そしてなぜそれを使うのですか?
-
[解決済み] org.apache.catalina.connector.ClientAbortException: java.io.IOException。APRエラー: -32
-
[解決済み] TomcatがremoveAbandonedTimeoutを無視して、プール内の接続をクローズする
-
tomcat サーバーを起動するとエラーが発生する Context の初期化に失敗しました。
-
[解決済み] NetBeansからのTomcat起動エラー - '127.0.0.1*' が内部コマンドまたは外部コマンドとして認識されない
-
[解決済み] サーバー http:/localhost:8080 は、ユーザー名とパスワードが必要です。とサーバーは言っています。XDB
-
tomcat 起動エラー。ProtocolHandler["ajp-nio-8009"] に関連するエンドポイントの破棄に失敗しました (非常に簡単な解決方法)
-
[解決済み] IntelliJとTomcat...変更したファイルがTomcatで自動認識されない
-
[解決済み] Java Web アプリケーションでアプリケーションサーバーの外側から静的データを提供する最も簡単な方法
-
[解決済み] IntelliJとTomcat... Howto...?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TOMCAT SSL Error: エイリアス名がキーエントリーを識別していない
-
[解決済み] keytool error: java.lang.Exception: 応答からのチェーンの確立に失敗しました
-
maven reports an error the goal you specified requires a project to execute but there is no POM in this direct...
-
少なくとも1つのJARがTLDをスキャンされましたが、TLDが含まれていません。
-
tomcat start report c3p0プールの初期化中... Com.mchange.v2.c3p0.
-
NamingException: このクラスローダーにバインドされているネーミング・コンテキストがありません。
-
[解決済み] NetBeansからのTomcat起動エラー - '127.0.0.1*' が内部コマンドまたは外部コマンドとして認識されない
-
[解決済み] サーバー http:/localhost:8080 は、ユーザー名とパスワードが必要です。とサーバーは言っています。XDB
-
[解決済み] MaxMetaspaceSizeを設定した方が良いですか?
-
[解決済み] JBossとTomcatの比較 [終了しました]。