- - PR -
SQLSERVER+Tomcatでプールが解放されない
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-10-31 17:17
コネクションプールが解放されないで困っています。
原因・解決策を教えてください。 環境 Windows2003 SQLSERVER2005 TOMCAT6 JAVA6 Struts1.3.8 TOMCATのcontext.xmlにデータソースを記述し、JAVAでコネクションを張っています。 maxActiveを5にして、ページを5回リロードすると Cannot get a connection, pool error Timeout waiting for idle object とエラーが発生します。 removeAbandonedの設定で、指定時間による解放は出来ていますが、 コネクションクローズによるプールの再利用が出来ていない状態です。 JAVAではデータソースからコネクションを取得して、 DataSource ds = (DataSource) context.lookup("java:/comp/env/jdbc/niDataSource"); conn = ds.getConnection(); 最後に conn.close(); としています。 OracleやPostgreSQLでは再利用できたのですが、SQLSERVERのみできません。 SQLSERVER側の設定でしょうか? それとも、xml定義やJAVA側の問題でしょうか? よろしくお願いします。 | ||||
|
投稿日時: 2008-10-31 17:52
事象だけ言われても、何とも答えようがないので、 ミニマムコードで試すなり、現状のコードで関連しそうな部分を提示していただくと、 切り分けしやすいかもしれません。 SQLServerに対してSQLを投げたときだけ、何か処理に失敗していて、 Connection#close()が呼ばれていないとか、そんな類の話かもしれませんが、 何はともあれコードを提示していただかないと、なんとも言えません。 | ||||
|
投稿日時: 2008-10-31 20:14
ご回答ありがとうございます。
ご指摘の通り、最低限のコードで試したところ上手く解放できました。 しかし、それをクラス化すると解放できなくなりました。 クラス側でコネクション変数を用意して、それを利用すると駄目でした。 ログを入れて、closeがコールされているのは確認できているのですが・・・。 DBクラスは public Connection getConnection() throws SQLException { // Connectionオブジェクト Connection conn = null; try{ Context context = new InitialContext(); DataSource ds = (DataSource) context.lookup("java:/comp/env/jdbc/DataSource"); conn = ds.getConnection(); if(conn.getAutoCommit() == true){ conn.setAutoCommit(false); } }catch(Exception e){ e.printStackTrace(System.out); } return conn; } とコネクションを張って、返却しています。 アクション側で、 Connection conn = null; ComDB db = new ComDB(); conn = db.getConnection(); if(conn != null){ conn.commit(); conn.rollback(); conn.close(); conn = null; } if(db != null){ db = null; } と書いています。 SQLは何も発行しておらず、closeもログに出したところ、呼ばれていました。 PostgresSQLではこれでよかったのですが、 SQLSERVER用としてはクラスの作り方が悪いのでしょうか? | ||||
|
投稿日時: 2008-11-01 02:19
記載されているソースは、うまく動くソースなのでしょうか?
失敗するソースなのでしょうか? ミニマムコードでうまく動くなら、違いは必ずあるはずです。
よく意味がわかりませんが、フィールドに格納しているということでしょうか。 | ||||
|
投稿日時: 2008-11-04 09:17
ご回答ありがとうございます。
記載しているコードは上手くいかないほうです。 クラス側でコネクション変数を用意というのは、 記載しているコードでは、Connection conn の実体をアクション側で持っていますが、 DBクラス側にメンバ変数として持たせて、ConnectionをDBクラス内部だけで操作しても、同様の現象が発生してしまったという意味です。 わかりずらくてすいません。 DB部をクラス化しないと上手く行っているので、クラスの作り方を色々と変えて試してみます。 |
1