4

我面临一个奇怪的生产问题。环境如下:

  • JBOSS 4.0.2
  • SQL 服务器 2005
  • 驱动程序 JTDS 1.2.5

不时会发生以下情况。

SQL 命令无法执行

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

(我可以忍受,如果它每天只发生两次左右)

但是从那一刻起,连接似乎在没有池识别的情况下被浪费了,因为我不断收到

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>

任何帮助appriciated。

问候

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 驱动程序。希望这可以节省您半小时的生产时间。

修复方法是为 Apache dbcp2 连接池实现指定一个验证查询。对于 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 回答