Seu problema é que o jTDS não suporta a maneira como o DBCP2 valida uma conexão por padrão (suponho que você use o DBCP2 de
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Veja a solução abaixo. Normalmente, o stacktrace do erro é como mostrado:
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)
O problema, no entanto, não está relacionado à versão do SQL Server, mas à versão DBCP (Tomcat) usada (ou à versão do servidor Tomcat na qual o projeto está implantado).
Uma vez eu estava usando o jTDS 1.3.1 e o projeto funcionou bem (e conectado ao SQLServer 2012 também) no Tomcat7. Quando mudei para o Tomcat 8, esse erro apareceu.
O motivo, como sugeriu nos fóruns jTDS , é:
- (Tomcat7 usa DBCP 1 e Tomcat 8 usa DBCP 2 )
- Diferente de DBCP 1.x , DBCP 2 chamará
java.sql.Connection.isValid(int)
para validar a conexão - jTDS não implementa
.isValid()
, então o driver jTDS não funcionará com DBCP 2, a menos que... - ... a menos que você defina a
validationQuery
parâmetro, que fará com que o DBCP não chame.isValid()
para testar a validade da conexão.
Solução
Portanto, a solução é definir a
validationQuery
parâmetro , o que fará com que o DBCP2 não chame .isValid()
para testar a validade da conexão. Veja como:No Tomcat
Adicionar
validationQuery="select 1"
para o seu Tomcat <Resource>
tag para pool de conexão, que geralmente está em META-INF/context.xml
do seu aplicativo ou conf/server.xml
:<Resource ... validationQuery="select 1" />
Na primavera
Ao usar DBCP2 por meio do Spring, a solução é algo em torno de:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
No código Java simples
dataSource.setValidationQuery("select 1");