sql >> Base de Datos >  >> RDS >> Sqlserver

¿Java Hibernate con SQL Server 2012 no funciona?

Su problema es que jTDS no admite la forma en que DBCP2 valida una conexión de forma predeterminada (supongo que usa DBCP2 de <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"> ). Vea la solución a continuación.

Por lo general, el seguimiento de la pila de errores es como se muestra:

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)

Sin embargo, el problema no está relacionado con la versión de SQL Server, sino con la versión DBCP (Tomcat) utilizada (o la versión del servidor Tomcat en la que se implementa el proyecto).

Una vez que estaba usando jTDS 1.3.1 y el proyecto funcionó bien (y también se conectó a SQLServer 2012) en Tomcat7. Cuando cambié a Tomcat 8, apareció ese error.

El motivo, como insinuado en los foros de jTDS , es:

  • (Tomcat7 usa DBCP 1 y Tomcat 8 usa DBCP 2 )
  • A diferencia de DBCP 1.x , DBCP 2 llamará a java.sql.Connection.isValid(int) para validar la conexión
  • jTDS no implementa .isValid() , por lo que el controlador jTDS no funcionará con DBCP 2, a menos que...
  • ... a menos que establezca la validationQuery parámetro, que hará que DBCP no llame a .isValid() para probar la validez de la conexión.

Solución alternativa

Entonces, la solución es establecer validationQuery parámetro , lo que hará que DBCP2 no llame a .isValid() para probar la validez de la conexión. Así es como:

En Tomcat

Agregue validationQuery="select 1" a su Tomcat <Resource> etiqueta para el grupo de conexiones, que normalmente se encuentra en META-INF/context.xml de su aplicación o conf/server.xml :

<Resource ... validationQuery="select 1" />

En Primavera

Cuando se usa DBCP2 a través de Spring, la solución es algo así como:

<bean id="..." ...> 
    ...
    <property name="validationQuery" value="select 1" />
</bean>

Sobre código java simple

dataSource.setValidationQuery("select 1");