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