Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Java Hibernate mit SQL Server 2012 funktioniert nicht?

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