- - PR -
JNDIによるMySQL接続について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-06-03 15:12
TOMCAT6
MySQL ver5.0.22 JDBC (mysql-connector-java-5.1.2) の環境において、JNDIによるDataSource取得による DB接続処理をしていますが、 ある一定時間経過後にDB接続処理をすると例外が 発生してしまいます。以下がtomcatのログです。 java.sql.SQLException: Already closed. at org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:84) at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181) at db.DbOperation.connect(DbOperation.java:40) at action.DispPlanSerchAction.execute(DispPlanSerchAction.java:149) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at action.MyActionServlet.process(MyActionServlet.java:12) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:169) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) at java.lang.Thread.run(Thread.java:619) 続けてDB接続処理を実行すると問題なく接続されます。 Poolなんたらと言うエラーが出ているので、JNDIの設定関係が原因ではと 思っております。 以下、Server.xml内のJNDI関連の設定値です。 <Resource name="jdbc/MySQL" auth="Container" type="javax.sql.DataSource" username="ユーザー名" password="パスワード" driverClassName="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost/db" maxActive="2000" maxIdle="200" maxWait="15000" removeAbandoned="true" removeAbandonedTimeout="180" /> 正直、maxActiveとかmaxIdleとかWEBで調べましたが、 いまいち意味が理解できないので、適当に設定してしまいました。 ここら辺の値が駄目なのでしょうか? | ||||
|
投稿日時: 2008-06-04 08:46
値が駄目かどうかより、プロとして駄目です。 coogonさんの住宅について 「xxxって基準値があって安全にかかわるもののようだけど、 いまいち意味が理解できないので、適当に設定してしまいました。」って 造った人に言われたらブチ切れるでしょ? 「validationQuery」という機能があるので、これを使えばよいと思われます。 http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html http://commons.apache.org/dbcp/configuration.html ネットワーク経路にIPマスカレードをするようなところがあるようだったら、 そこが原因かもしれませんね。 | ||||
|
投稿日時: 2008-06-04 12:01
Java僧さんご回答ありがとうございました。
validationQueryを設定してみて、確認中です。 実際、どれくらいでタイムアウトになるのかわかっていないので、 最大24時間経過でも問題なかったら、問題解決としたいと 思っています。 Java僧さんのご指摘の通り、「意味わからず適当に設定」は まずいですよね・・・ まったく意味が理解できていない訳ではなかったのですが、 自分で解釈した内容が正しい自信が無いと言った感じです。 そこで、もしよろしければ、以下の意味が私の解釈であっているかも 誰か教えて頂けないでしょうか。 ========================== 私の解釈 ================================ 前提:そもそもJNDIを利用してJDBC接続をする場合、毎回新規にDB接続を するのでは無く、ある程度の接続をプール(保持)しておき、それ を利用する事により、接続処理を高速化させている。 maxActive : 同時に接続できる最大数。これ以上は同時に接続できない? maxIdle : 仮に誰も接続していない時でも接続状態を残している数。 maxWait : 接続NGとなるまでの待ち時間。仮にmaxActiveの時に新規接続を した場合にビジーとなった場合、この時間まで待ち、その間に どこかの接続が空きになれば接続が成功するし、空きにならなけ ば失敗となる。 removeAbandoned(True) : close処理されなかったり何かしらの事象により 利用不可能になった接続を空きにする removeAbandonedTimeout : 上記のタイムアウト時間 ======================================================================== こんなイメージでいましたが、間違っていますか? 誰かご指摘ください。宜しくお願いします。 | ||||
|
投稿日時: 2008-06-04 12:34
解釈はおおむねそれでいいと思いますが、
「接続」という言葉が、「RDBMS←→DBCP間」と 「DBCP←→ユーザアプリ間」の2つに使われていますね。 脳内でうまく整理できていれば問題ありません。 #MySQLの設定もこんなに大きな数字に変えているのかな? Abandonedは通常はtrueにする必要はないです。 自分の関わった案件では一度もtrueに設定したことはありません。 | ||||
|
投稿日時: 2008-06-04 13:55
Java僧さんご回答ありがとうございました。
そうですね、MySQLのmax_connectionsは1000にしているので、 maxActiveもそれに合わせようと思っています。 maxIdleは私の解釈では、同時アクセスの平均値程度が良い かと思っているので、実際は20〜30くらいなので、それ位に 変更しようかと思ってます。 |
1