Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Java Hibernate avec SQL Server 2012 ne fonctionne pas ?

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");