Váš problém je, že jTDS nepodporuje způsob, jakým DBCP2 standardně ověřuje připojení (předpokládám, že používáte DBCP2 z <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Viz řešení níže.
Chyba stacktrace obvykle vypadá takto:
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)
Problém však nesouvisí s verzí SQL Serveru, ale s použitou verzí DBCP (Tomcat) (nebo verzí serveru Tomcat, na kterou je projekt nasazen).
Jednou jsem používal jTDS 1.3.1 a projekt fungoval dobře (a také se připojil k SQLServeru 2012) pod Tomcat7. Když jsem přešel na Tomcat 8, objevila se tato chyba.
Důvod, jak naznačil na fórech jTDS , je:
- (Tomcat7 používá DBCP 1 a Tomcat 8 používá DBCP 2 )
- Na rozdíl od DBCP 1.x , DBCP 2 zavolá
java.sql.Connection.isValid(int)
k ověření připojení - jTDS neimplementuje
.isValid()
, takže ovladač jTDS nebude fungovat s DBCP 2, pokud... - ...pokud nenastavíte
validationQuery
parametr, který způsobí, že DBCP nebude volat.isValid()
otestovat platnost spojení.
Řešení
Řešením je tedy nastavit validationQuery
parametra , což způsobí, že DBCP2 nebude volat .isValid()
otestovat platnost spojení. Zde je postup:
Na Tomcat
Přidejte validationQuery="select 1"
do vašeho Tomcatu <Resource>
tag pro fond připojení, který je obvykle v META-INF/context.xml
vaší aplikace nebo conf/server.xml
:
<Resource ... validationQuery="select 1" />
Na jaře
Při použití DBCP2 přes Spring je řešením něco kolem:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
Na jednoduchém kódu Java
dataSource.setValidationQuery("select 1");