- PR -

JNDIによるMySQL接続について

1
投稿者投稿内容
coogon
常連さん
会議室デビュー日: 2004/07/09
投稿数: 27
投稿日時: 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で調べましたが、
いまいち意味が理解できないので、適当に設定してしまいました。
ここら辺の値が駄目なのでしょうか?


Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-06-04 08:46
引用:
正直、maxActiveとかmaxIdleとかWEBで調べましたが、
いまいち意味が理解できないので、適当に設定してしまいました。
ここら辺の値が駄目なのでしょうか?


値が駄目かどうかより、プロとして駄目です。
coogonさんの住宅について
「xxxって基準値があって安全にかかわるもののようだけど、
いまいち意味が理解できないので、適当に設定してしまいました。」って
造った人に言われたらブチ切れるでしょ?

「validationQuery」という機能があるので、これを使えばよいと思われます。
http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html
http://commons.apache.org/dbcp/configuration.html

ネットワーク経路にIPマスカレードをするようなところがあるようだったら、
そこが原因かもしれませんね。
coogon
常連さん
会議室デビュー日: 2004/07/09
投稿数: 27
投稿日時: 2008-06-04 12:01
Java僧さんご回答ありがとうございました。

validationQueryを設定してみて、確認中です。
実際、どれくらいでタイムアウトになるのかわかっていないので、
最大24時間経過でも問題なかったら、問題解決としたいと
思っています。

Java僧さんのご指摘の通り、「意味わからず適当に設定」は
まずいですよね・・・

まったく意味が理解できていない訳ではなかったのですが、
自分で解釈した内容が正しい自信が無いと言った感じです。
そこで、もしよろしければ、以下の意味が私の解釈であっているかも
誰か教えて頂けないでしょうか。

========================== 私の解釈 ================================

前提:そもそもJNDIを利用してJDBC接続をする場合、毎回新規にDB接続を
するのでは無く、ある程度の接続をプール(保持)しておき、それ
を利用する事により、接続処理を高速化させている。

maxActive : 同時に接続できる最大数。これ以上は同時に接続できない?

maxIdle : 仮に誰も接続していない時でも接続状態を残している数。

maxWait : 接続NGとなるまでの待ち時間。仮にmaxActiveの時に新規接続を
した場合にビジーとなった場合、この時間まで待ち、その間に
どこかの接続が空きになれば接続が成功するし、空きにならなけ
ば失敗となる。

removeAbandoned(True) : close処理されなかったり何かしらの事象により
利用不可能になった接続を空きにする

removeAbandonedTimeout : 上記のタイムアウト時間

========================================================================

こんなイメージでいましたが、間違っていますか?
誰かご指摘ください。宜しくお願いします。
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2008-06-04 12:34
解釈はおおむねそれでいいと思いますが、
「接続」という言葉が、「RDBMS←→DBCP間」と
「DBCP←→ユーザアプリ間」の2つに使われていますね。
脳内でうまく整理できていれば問題ありません。
#MySQLの設定もこんなに大きな数字に変えているのかな?

Abandonedは通常はtrueにする必要はないです。
自分の関わった案件では一度もtrueに設定したことはありません。
coogon
常連さん
会議室デビュー日: 2004/07/09
投稿数: 27
投稿日時: 2008-06-04 13:55
Java僧さんご回答ありがとうございました。

そうですね、MySQLのmax_connectionsは1000にしているので、
maxActiveもそれに合わせようと思っています。
maxIdleは私の解釈では、同時アクセスの平均値程度が良い
かと思っているので、実際は20〜30くらいなので、それ位に
変更しようかと思ってます。
1

スキルアップ/キャリアアップ(JOB@IT)