我面临一个奇怪的生产问题。环境如下:
有时会出现以下情况。
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>
任何有用的帮助。
此致
答案 0 :(得分:7)
尝试将驱动程序类行更改为 net.sourceforge.jtds.jdbcx.JtdsDataSource。 net.sourceforge.jtds.jdbc.Driver未实现javax.sql.ConnectionPoolDataSource接口。 资源: http://jtds.sourceforge.net/faq.html#features
答案 1 :(得分:3)
解决方案可能为时已晚,但我在这里遇到了jtds驱动程序。希望这可以节省半小时的工作时间。
修复方法是为Apache dbcp2连接池实现指定validationQuery。 对于jtds / sql server 我指定了弹簧配置如下:
<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");
答案 2 :(得分:0)
Connection.isValid()
。
我发现即使捕获异常并强制完全重启连接也不起作用。