- PR -

SQLSERVER+Tomcatでプールが解放されない

1
投稿者投稿内容
はいいろ
会議室デビュー日: 2008/10/31
投稿数: 3
投稿日時: 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側の問題でしょうか?

よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-10-31 17:52
コード:
それとも、xml定義やJAVA側の問題でしょうか? 


事象だけ言われても、何とも答えようがないので、
ミニマムコードで試すなり、現状のコードで関連しそうな部分を提示していただくと、
切り分けしやすいかもしれません。

SQLServerに対してSQLを投げたときだけ、何か処理に失敗していて、
Connection#close()が呼ばれていないとか、そんな類の話かもしれませんが、
何はともあれコードを提示していただかないと、なんとも言えません。
はいいろ
会議室デビュー日: 2008/10/31
投稿数: 3
投稿日時: 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用としてはクラスの作り方が悪いのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-11-01 02:19
記載されているソースは、うまく動くソースなのでしょうか?
失敗するソースなのでしょうか?
ミニマムコードでうまく動くなら、違いは必ずあるはずです。

引用:

クラス側でコネクション変数を用意して、それを利用すると駄目でした。


よく意味がわかりませんが、フィールドに格納しているということでしょうか。
はいいろ
会議室デビュー日: 2008/10/31
投稿数: 3
投稿日時: 2008-11-04 09:17
ご回答ありがとうございます。
記載しているコードは上手くいかないほうです。

クラス側でコネクション変数を用意というのは、
記載しているコードでは、Connection conn の実体をアクション側で持っていますが、
DBクラス側にメンバ変数として持たせて、ConnectionをDBクラス内部だけで操作しても、同様の現象が発生してしまったという意味です。
わかりずらくてすいません。

DB部をクラス化しないと上手く行っているので、クラスの作り方を色々と変えて試してみます。
1

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