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