JTDS和JBOSS JDBC连接池问题,有解决方案吗?也许是定制的ValidConnectionChecker?

JTDS和JBOSS JDBC连接池问题,有解决方案吗?也许是定制的ValidConnectionChecker?,jdbc,jboss,jtds,Jdbc,Jboss,Jtds,我正面临一个奇怪的生产问题。环境包括: JBoss4.0.2 SQL Server 2005 驾驶员JTDS 1.2.5 不时会发生以下情况 SQL命令无法使用执行 java.sql.SQLException: I/O Error: Read timed out (如果一天发生两次左右,我可以接受) 但从那一刻起,连接似乎被浪费了,而池没有意识到它,因为我不断地收到 java.sql.SQLException: Invalid state, the Connection object

我正面临一个奇怪的生产问题。环境包括:

  • JBoss4.0.2
  • SQL Server 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>
选择getdate()
在我的数据源定义中设置

  <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>
我想知道是否可以使用自定义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>

MyDS
jdbc:jtds:sqlserver://192.168.35.235:1433/MyDb;user=user1;密码=pwd;appName=MyApp;loginTimeout=15;socketTimeout=120
net.sourceforge.jtds.jdbc.Driver
用户1
pwd
10
25
60000
1.
选择getdate()

谢谢你的帮助

关于连接。在JTDS中未实现isValid()。
我发现,即使捕获异常并强制完全重新启动连接也不起作用。

尝试将驱动程序类行更改为 net.sourceforge.jtds.jdbcx.JtdsDataSource。 net.sourceforge.jtds.jdbc.Driver未实现javax.sql.ConnectionPoolDataSource接口。 资料来源:

解决方案可能太晚了,但我仍然坚持使用jtds驱动程序。希望这能节省你半小时的工作时间

修复方法是为Apache dbcp2连接池实现指定validationQuery。 对于jtds/sql server 我指定了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>

这可能吗?在JBoss中,你真的能用数据源代替驱动程序吗?