JTDS和JBOSS JDBC连接池问题,有解决方案吗?也许需要自定义ValidConnectionChecker?

4
我遇到了一个奇怪的生产问题。环境如下:
  • JBOSS 4.0.2
  • SQL Server 2005
  • Driver 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>

任何帮助都将不胜感激。
敬礼。
3个回答

7

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

来源: http://jtds.sourceforge.net/faq.html#features

3
这是否可能?你真的可以在JBoss中使用DataSource替代Driver吗? - pm_labs

3

也许这个解决方案有点晚了,但我在这里被jtds驱动程序卡住了。希望这能节省你的半小时生产时间。

解决方法是为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");

0

Connection.isValid() 在JTDS中没有实现。 我发现即使捕获异常并强制完全重启连接也无法解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接