4

私は奇妙な生産上の問題に直面しています。環境は次のとおりです。

  • JBOSS4.0.2
  • SQL Server 2005
  • ドライバー JTDS 1.2.5

時々、次のシナリオが発生します。

SQL コマンドの実行に失敗する

 java.sql.SQLException: I/O Error: Read timed out 

(1日2回くらいなら我慢できる)

しかし、その瞬間から、プールがそれを認識せずに接続が無駄になっているように見えます。

java.sql.SQLException: Invalid state, the Connection object is closed.

その瞬間から。JBOSS を再起動するだけで解決します。これは、私が持っているという事実にもかかわらず発生します

 <check-valid-connection-sql>select getdate()</check-valid-connection-sql>

私のデータソース定義で設定します。

接続自体を再構築するか、例外を明示的にスローしてこれを修正するカスタム ValidConnectionChecker を使用できるかどうか疑問に思っていました。多分誰かが他の提案を持っています。

これが私の完全な DS 定義です。

  <local-tx-datasource>
    <jndi-name>MyDS</jndi-name>
    <connection-url>jdbc:jtds:sqlserver://192.168.35.235:1433/MyDb;user=user1;password=pwd;appName=MyApp;loginTimeout=15;socketTimeout=120</connection-url>
    <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
    <user-name>user1</user-name>
    <password>pwd</password>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>25</max-pool-size>
    <blocking-timeout-millis>60000</blocking-timeout-millis>
    <idle-timeout-minutes>1</idle-timeout-minutes>
    <check-valid-connection-sql>select getdate()</check-valid-connection-sql>
  </local-tx-datasource>

任意の助けが必要です。

よろしく

4

3 に答える 3

7

ドライバー クラスの行を net.sourceforge.jtds.jdbcx.JtdsDataSource に変更してみてください。net.sourceforge.jtds.jdbc.Driver は javax.sql.ConnectionPoolDataSource インターフェイスを実装していません。ソース: http://jtds.sourceforge.net/faq.html#features

于 2010-10-21T10:48:33.933 に答える
3

おそらく解決策が遅すぎますが、ここで jtds ドライバーに行き詰まっています。これにより、生産的な時間が 30 分節約されることを願っています。

解決策は、Apache dbcp2 接続プールの実装に validationQuery を指定することです。jtds/sql サーバーの場合、Spring 構成を次のように指定しました。

<bean id="sqlServerDS" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" >
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="defaultReadOnly" value="true" />
    <property name="validationQuery" value="select 1" />
</bean>

Spring を使用していない場合は、Java コードで BasicDataSource の setValidationQuery メソッドを呼び出します。

BasicDataSource bds = new BasicDataSource();
bds.setValidationQuery("select 1");
于 2014-09-01T20:04:10.437 に答える
0

Connection.isValid()JTDS には実装されていません。例外をキャッチして、接続の完全な再起動を強制しても機能しないことがわかりました。

于 2010-10-06T07:14:28.227 に答える