Votre problème est que jTDS ne prend pas en charge la façon dont DBCP2 valide une connexion par défaut (je suppose que vous utilisez DBCP2 à partir de <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Voir la solution ci-dessous.
Habituellement, l'erreur stacktrace est comme indiqué :
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)
Le problème, cependant, n'est pas lié à la version de SQL Server, mais à la version DBCP (Tomcat) utilisée (ou à la version du serveur Tomcat sur laquelle le projet est déployé).
Une fois, j'utilisais jTDS 1.3.1 et le projet fonctionnait bien (et se connectait également à SQLServer 2012) sous Tomcat7. Lorsque je suis passé à Tomcat 8, cette erreur est apparue.
La raison, comme suggéré dans les forums jTDS , est :
- (Tomcat7 utilise DBCP 1 et Tomcat 8 utilise DBCP 2 )
- Contrairement à DBCP 1.x , DBCP 2 appellera
java.sql.Connection.isValid(int)
pour valider la connexion - jTDS n'implémente pas
.isValid()
, donc le pilote jTDS ne fonctionnera pas avec DBCP 2, sauf si... - ...sauf si vous définissez la
validationQuery
paramètre, ce qui empêchera DBCP d'appeler.isValid()
pour tester la validité de la connexion.
Solution
Ainsi, la solution de contournement consiste à définir le validationQuery
paramètre , ce qui empêchera DBCP2 d'appeler .isValid()
pour tester la validité de la connexion. Voici comment :
Sur Tomcat
Ajouter validationQuery="select 1"
à votre Tomcat <Resource>
balise pour le pool de connexion, qui se trouve généralement dans META-INF/context.xml
de votre application ou conf/server.xml
:
<Resource ... validationQuery="select 1" />
Au printemps
Lorsque vous utilisez DBCP2 jusqu'à Spring, la solution est quelque chose autour :
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
Sur le code Java simple
dataSource.setValidationQuery("select 1");