Twój problem polega na tym, że jTDS nie obsługuje sposobu, w jaki DBCP2 domyślnie sprawdza poprawność połączenia (zakładam, że używasz DBCP2 z <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Zobacz rozwiązanie poniżej.
Zwykle ślad stosu błędów jest taki, jak pokazano:
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)
Problem nie jest jednak związany z wersją SQL Server, ale z używaną wersją DBCP (Tomcat) (lub wersją serwera Tomcat, na której projekt jest wdrażany).
Kiedyś używałem jTDS 1.3.1 i projekt działał dobrze (i połączony z SQLServer 2012) pod Tomcat7. Gdy przesiadłem się na Tomcata 8, pojawił się ten błąd.
Powód, jak podkreślono na forach jTDS , to:
- (Tomcat7 używa DBCP 1, a Tomcat 8 używa DBCP 2 )
- W przeciwieństwie do DBCP 1.x , DBCP 2 wywoła
java.sql.Connection.isValid(int)
aby zweryfikować połączenie - jTDS nie implementuje
.isValid()
, więc sterownik jTDS nie będzie działał z DBCP 2, chyba że... - ...chyba że ustawisz
validationQuery
parametr, który sprawi, że DBCP nie wywoła.isValid()
aby przetestować poprawność połączenia.
Obejście
Tak więc obejściem jest ustawienie validationQuery
parametr , co sprawi, że DBCP2 nie wywoła .isValid()
aby przetestować poprawność połączenia. Oto jak:
W Tomcat
Dodaj validationQuery="select 1"
do Twojego Tomcata <Resource>
znacznik puli połączeń, który zwykle znajduje się w META-INF/context.xml
Twojej aplikacji lub conf/server.xml
:
<Resource ... validationQuery="select 1" />
Na wiosnę
Podczas korzystania z DBCP2 za pośrednictwem Springa rozwiązaniem jest coś wokół:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
W prostym kodzie Java
dataSource.setValidationQuery("select 1");