Вашият проблем е, че jTDS не поддържа начина, по който DBCP2 валидира връзка по подразбиране (предполагам, че използвате DBCP2 от <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Вижте решението по-долу.
Обикновено проследяването на стека за грешка е както е показано:
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)
Проблемът обаче не е свързан с версията на SQL Server, а с използваната версия на DBCP (Tomcat) (или версията на сървъра Tomcat, към която проектът е разгърнат).
Веднъж използвах jTDS 1.3.1 и проектът работи добре (и също се свърза с SQLServer 2012) под Tomcat7. Когато преминах към Tomcat 8, тази грешка се появи.
Причината, както намеква във форумите на jTDS , е:
- (Tomcat7 използва DBCP 1, а Tomcat 8 използва DBCP 2 )
- За разлика от DBCP 1.x , DBCP 2 ще извика
java.sql.Connection.isValid(int)
за потвърждаване на връзката - jTDS не прилага
.isValid()
, така че jTDS драйверът няма да работи с DBCP 2, освен ако... - ...освен ако не зададете
validationQuery
параметър, който ще накара DBCP да не извиква.isValid()
за тестване на валидността на връзката.
Заобиколно решение
И така, заобиколното решение е да зададете validationQuery
параметъра , което ще накара DBCP2 да не извиква .isValid()
за тестване на валидността на връзката. Ето как:
На Tomcat
Добавете validationQuery="select 1"
към вашия Tomcat <Resource>
таг за набор от връзки, който обикновено е в META-INF/context.xml
на вашето приложение или conf/server.xml
:
<Resource ... validationQuery="select 1" />
Напролет
Когато използвате DBCP2 до Spring, решението е нещо около:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
На прост код на Java
dataSource.setValidationQuery("select 1");