Dit problem er, at jTDS ikke understøtter den måde, DBCP2 validerer en forbindelse på som standard (jeg går ud fra, at du bruger DBCP2 fra <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Se løsningen nedenfor.
Normalt er stacktrace-fejlen som vist:
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 er dog ikke relateret til SQL Server-versionen, men til den anvendte DBCP (Tomcat)-version (eller Tomcat-serverversionen, som projektet er implementeret til).
Engang brugte jeg jTDS 1.3.1, og projektet fungerede fint (og også forbundet til SQLServer 2012) under Tomcat7. Da jeg skiftede til Tomcat 8, dukkede den fejl op.
Årsagen, som antydet i jTDS-fora , er:
- (Tomcat7 bruger DBCP 1 og Tomcat 8 bruger DBCP 2 )
- I modsætning til DBCP 1.x , DBCP 2 kalder
java.sql.Connection.isValid(int)
for at validere forbindelsen - jTDS implementerer ikke
.isValid()
, så jTDS-driveren virker ikke med DBCP 2, medmindre... - ...medmindre du indstiller
validationQuery
parameter, som vil få DBCP til ikke at kalde.isValid()
for at teste gyldigheden af forbindelsen.
Løsning
Så løsningen er at indstille validationQuery
parameter , hvilket vil få DBCP2 til ikke at kalde .isValid()
for at teste gyldigheden af forbindelsen. Sådan gør du:
På Tomcat
Tilføj validationQuery="select 1"
til din Tomcat <Resource>
tag for forbindelsespulje, som normalt er i META-INF/context.xml
af din app eller conf/server.xml
:
<Resource ... validationQuery="select 1" />
Om foråret
Når du bruger DBCP2 til Spring, er løsningen noget omkring:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
På simpel java-kode
dataSource.setValidationQuery("select 1");