Uw probleem is dat jTDS de manier waarop DBCP2 standaard een verbinding valideert niet ondersteunt (ik neem aan dat u DBCP2 gebruikt van <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Zie de oplossing hieronder.
Gewoonlijk is de fout-stacktrace als volgt:
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)
Het probleem is echter niet gerelateerd aan de SQL Server-versie, maar aan de gebruikte DBCP (Tomcat)-versie (of de Tomcat-serverversie waarop het project is geïmplementeerd).
Ooit gebruikte ik jTDS 1.3.1 en het project werkte prima (en ook verbonden met SQLServer 2012) onder Tomcat7. Toen ik overstapte naar Tomcat 8, verscheen die fout.
De reden, zoals suggereerde in jTDS-forums , is:
- (Tomcat7 gebruikt DBCP 1 en Tomcat 8 gebruikt DBCP 2 )
- In tegenstelling tot DBCP 1.x , DBCP 2 zal
java.sql.Connection.isValid(int)
. aanroepen om de verbinding te valideren - jTDS implementeert
.isValid()
niet , dus jTDS-stuurprogramma werkt niet met DBCP 2, tenzij... - ...tenzij u de
validationQuery
. instelt parameter, waardoor DBCP.isValid()
. niet aanroept om de geldigheid van de verbinding te testen.
Tussenoplossing
De oplossing is dus om de validationQuery
in te stellen parameter , waardoor DBCP2 .isValid()
. niet aanroept om de geldigheid van de verbinding te testen. Dit is hoe:
Op Tomcat
Voeg validationQuery="select 1"
toe naar uw Tomcat <Resource>
tag voor verbindingspool, die zich meestal in META-INF/context.xml
bevindt van uw app of conf/server.xml
:
<Resource ... validationQuery="select 1" />
In de lente
Bij gebruik van DBCP2 via Spring is de oplossing iets in de buurt:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
Op eenvoudige Java-code
dataSource.setValidationQuery("select 1");