您的问题是jTDS默认不支持DBCP2验证连接的方式(我假设您使用的DBCP2
<bean id="dataSource">)。请参阅下面的解决方案。
通常,错误堆栈跟踪如下所示:
Caused by: java.lang.AbstractMethodError at net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833) at org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:913)
但是,问题与SQL Server版本无关,而与所使用的DBCP(Tomcat)版本(或项目部署到的Tomcat服务器版本)有关。
使用jTDS 1.3.1之后,该项目在Tomcat7下运行良好(并也连接到SQLServer 2012)。当我更改为Tomcat 8时,出现了该错误。
正如jTDS论坛所暗示的,原因是:
- ( Tomcat7使用DBCP 1,Tomcat 8使用DBCP 2 )
- 与 DBCP 1.x 不同, DBCP 2 将调用
java.sql.Connection.isValid(int)
以验证连接 - jTDS未实现
.isValid()
,因此jTDS驱动程序无法与DBCP 2一起使用,除非… - …除非您设置
validationQuery
参数,否则该参数将使DBCP不会调用.isValid()
以测试连接的有效性。
解决方法
因此,解决方法是 设置validationQuery
参数,这将使DBCP2不被调用
.isValid()以测试连接的有效性。就是这样:
在Tomcat上
validationQuery="select 1"将您的Tomcat
<Resource>标签添加到连接池中,该标签通常位于
meta-INF/context.xml您的应用程序中或
conf/server.xml:
<Resource ... validationQuery="select 1" />
在spring
通过Spring使用DBCP2时,解决方案是:
<bean id="..." ...> ... <property name="validationQuery" value="select 1" /></bean>
在简单的Java代码上
dataSource.setValidationQuery("select 1");


