Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Java Hibernate com SQL Server 2012 não está funcionando?


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