Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Hibernacja Java z SQL Server 2012 nie działa?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Aktualizacja lub wstawienie widoku lub funkcji nie powiodło się, ponieważ zawiera pole pochodne lub stałe

  2. Jak używać podobnego warunku z wieloma wartościami w sql server 2005?

  3. FOR XML PATH i konkatenacja ciągów

  4. Jak uzyskać wartość CSV dla następującego scenariusza?

  5. Jaka jest różnica między tabelą upuszczania a tabelą usuwania w programie SQL Server?