Ihr Problem ist, dass jTDS die Art und Weise, wie DBCP2 standardmäßig eine Verbindung validiert, nicht unterstützt (ich gehe davon aus, dass Sie DBCP2 von <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Sehen Sie sich die Lösung unten an.
Normalerweise sieht der Fehler-Stacktrace wie folgt aus:
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)
Das Problem hängt jedoch nicht mit der SQL Server-Version zusammen, sondern mit der verwendeten DBCP (Tomcat)-Version (oder der Tomcat-Server-Version, auf der das Projekt bereitgestellt wird).
Einmal habe ich jTDS 1.3.1 verwendet und das Projekt hat unter Tomcat7 einwandfrei funktioniert (und auch mit SQLServer 2012 verbunden). Als ich zu Tomcat 8 wechselte, erschien dieser Fehler.
Der Grund, wie in jTDS-Foren angedeutet wird , ist:
- (Tomcat7 verwendet DBCP 1 und Tomcat 8 verwendet DBCP 2 )
- Im Gegensatz zu DBCP 1.x , DBCP 2 wird
java.sql.Connection.isValid(int)
aufrufen um die Verbindung zu validieren - jTDS implementiert
.isValid()
nicht , daher funktioniert der jTDS-Treiber nicht mit DBCP 2, es sei denn... - ...es sei denn, Sie setzen die
validationQuery
Parameter, wodurch DBCP.isValid()
nicht aufruft um die Gültigkeit der Verbindung zu testen.
Problemumgehung
Die Problemumgehung besteht also darin, die validationQuery
festzulegen Parameter , wodurch DBCP2 .isValid()
nicht aufruft um die Gültigkeit der Verbindung zu testen. So geht's:
Auf Tomcat
Fügen Sie validationQuery="select 1"
hinzu zu Ihrem Tomcat <Resource>
-Tag für den Verbindungspool, der sich normalerweise in META-INF/context.xml
befindet Ihrer App oder conf/server.xml
:
<Resource ... validationQuery="select 1" />
Im Frühling
Wenn Sie DBCP2 über Spring verwenden, liegt die Lösung in etwa bei:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
Über einfachen Java-Code
dataSource.setValidationQuery("select 1");