Ditt problem är att jTDS inte stöder det sätt som DBCP2 validerar en anslutning som standard (jag antar att du använder DBCP2 från <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Se lösningen nedan.
Vanligtvis är stacktrace-felet som visas:
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)
Problemet är dock inte relaterat till SQL Server-versionen, utan till DBCP-versionen (Tomcat) som används (eller Tomcat-serverversionen som projektet är distribuerat till).
En gång använde jag jTDS 1.3.1 och projektet fungerade bra (och kopplat till SQLServer 2012 också) under Tomcat7. När jag bytte till Tomcat 8 dök det felet upp.
Anledningen, som antydde i jTDS-forum , är:
- (Tomcat7 använder DBCP 1 och Tomcat 8 använder DBCP 2 )
- Till skillnad från DBCP 1.x , DBCP 2 anropar
java.sql.Connection.isValid(int)
för att validera anslutningen - jTDS implementerar inte
.isValid()
, så jTDS-drivrutinen fungerar inte med DBCP 2, om inte... - ...om du inte ställer in
validationQuery
parameter, vilket gör att DBCP inte anropar.isValid()
för att testa anslutningens giltighet.
Lösning
Så lösningen är att ställa in validationQuery
parameter , vilket gör att DBCP2 inte anropar .isValid()
för att testa anslutningens giltighet. Så här gör du:
På Tomcat
Lägg till validationQuery="select 1"
till din Tomcat <Resource>
tagg för anslutningspool, som vanligtvis finns i META-INF/context.xml
av din app eller conf/server.xml
:
<Resource ... validationQuery="select 1" />
På våren
När du använder DBCP2 till Spring är lösningen något runt:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
På enkel java-kod
dataSource.setValidationQuery("select 1");