- PR -

SybaseとDBCP

1
投稿者投稿内容
Goofy
会議室デビュー日: 2004/11/19
投稿数: 3
投稿日時: 2004-11-19 11:19
TomcatでDBCPの設定(データソースの作成)をして
Sybaseへ接続しようとしているのですが、以下のException
が発生してコネクションの取得が出来ていないようです。

どなたかSybaseを使ってDBCPでシステムを構築された方が
いらっしゃいましたらアドバイスをお願い致します。

以下に情報を明記させていただきます。

○Appサーバー
  JDK:1.4.1
  TOMCAT:5.0
  DBCP:1.1
  JConnect:5.5
  OS:Win2000 pro

○DBサーバー
  Sybase ASE11.5
  OS:Win2000 srv

○Tomcatデータソース作成内容
  JNDI名: jdbc/sybds
  データソースURL: jdbc:sybase:Tds:ホスト名:5000/DB名
  JDBCドライバクラス:com.sybase.jdbc2.jdbc.SybDriver
  ユーザ名:xxxx
  パスワード:xxxx
  有効な最大接続数:10
  アイドル状態の最大接続数:5
  最大接続待ち時間:5000
  クエリの検証:select count(*) from XXXX

○ソース
  Context context = new InitialContext();
 
  DataSource ds =
   (DataSource) context.lookup(dsname);

  con = ds.getConnection(); ←ここでException発生

○エラー内容
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:
java.util.NoSuchElementException: Could not create a validated object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericOb
jectPool.java:851)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSo
urce.java:140)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource
.java:518)
at ds.DS.execute(DS.java:77)
at ds.DS.doGet(DS.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:256)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.StandardContextValve.invokeInternal(Standard
ContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:195)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:21
1)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:805)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ssConnection(Http11Protocol.java:696)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java
:605)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP
ool.java:677)
at java.lang.Thread.run(Thread.java:536)
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-19 11:26
Sybaseに依存した現象でしょうか?
環境があれば他のデータベースで設定してみて切り分けてみてはいかがでしょう。
Goofy
会議室デビュー日: 2004/11/19
投稿数: 3
投稿日時: 2004-11-19 11:47
早速の回答ありがとうございます。

実際にPostgreSQL、DB2での接続確認
はしておりかなりの部分でSybaseに依存
していると考えております。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-11-22 10:50
引用:
Goofyさんの書き込み (2004-11-19 11:19) より:
org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted, cause:
java.util.NoSuchElementException: Could not create a validated object
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericOb
jectPool.java:851)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSo
urce.java:140)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource
.java:518)



私が見た事のあるメッセージとちょっと違うのですが、
borrowObject() 時に pool exhausted というのは
アクティブな接続が最大接続数に達していて、これ以上
接続を作成できないという事ではないでしょうか。

最大接続数以上の DB 接続をしなければならない程の
リクエストをしているなら、DBCP として正常な動作です。

そんなに DB 接続が多い筈は無いという事なら、
多分 Connection#close() し忘れです。

全てを新規に起動して、まったく同じ処理をさせると
PostgreSQL でも DB2 でも再現しませんか ?
Goofy
会議室デビュー日: 2004/11/19
投稿数: 3
投稿日時: 2004-11-22 16:21
はしもと様、回答ありがとうございます。

私も「pool exhausted 」という内容からコネクションの接続最大数
などを疑いSybaseを再起動したのですが、再起動後も同様の現象になって
います。

恐らく設定関連だと思っているのですが・・・
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-11-22 18:52
引用:
Goofyさんの書き込み (2004-11-22 16:21) より:
私も「pool exhausted 」という内容からコネクションの接続最大数
などを疑いSybaseを再起動したのですが、再起動後も同様の現象になって
います。



DBMS を再起動しても、アクティブな接続は管理下から外れないです。
切断された Connection を抱えた DelegatingConnection が、
正常なフリしてプールに戻されるのを待つだけです。

以下のパラメータを追加してみて下さい。
removeAbandoned = true
removeAbandonedTimeout = 300
logAbandoned = true

DataSource#getConnection() してから 5 分経っても
Connection#close() されなかったら強制的に close()
してログが出力されます。もしログが出力されたら
close() し忘れているという事です。
1

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