Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Java Hibernate con SQL Server 2012 non funziona?

Il tuo problema è che jTDS non supporta il modo in cui DBCP2 convalida una connessione per impostazione predefinita (suppongo che tu usi DBCP2 da <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"> ). Vedi la soluzione di seguito.

Di solito lo stacktrace di errore è come mostrato:

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)

Il problema, tuttavia, non è correlato alla versione di SQL Server, ma alla versione DBCP (Tomcat) utilizzata (o alla versione del server Tomcat a cui è distribuito il progetto).

Una volta stavo usando jTDS 1.3.1 e il progetto ha funzionato bene (e connesso anche a SQLServer 2012) con Tomcat7. Quando sono passato a Tomcat 8, è apparso quell'errore.

Il motivo, come accennato nei forum jTDS , è:

  • (Tomcat7 usa DBCP 1 e Tomcat 8 usa DBCP 2 )
  • A differenza di DBCP 1.x , DBCP 2 chiamerà java.sql.Connection.isValid(int) per convalidare la connessione
  • jTDS non implementa .isValid() , quindi il driver jTDS non funzionerà con DBCP 2, a meno che...
  • ...a meno che tu non imposti la validationQuery parametro, che farà in modo che DBCP non chiami .isValid() per verificare la validità della connessione.

Soluzione alternativa

Quindi, la soluzione alternativa è impostare la validationQuery parametro , che impedirà a DBCP2 di chiamare .isValid() per verificare la validità della connessione. Ecco come:

Su Tomcat

Aggiungi validationQuery="select 1" al tuo Tomcat <Resource> tag per il pool di connessioni, che di solito si trova in META-INF/context.xml della tua app o conf/server.xml :

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

In primavera

Quando si utilizza DBCP2 fino a Spring, la soluzione è qualcosa in giro:

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

Su codice Java semplice

dataSource.setValidationQuery("select 1");