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