sql >> Databáze >  >> RDS >> Sqlserver

Java Hibernate s SQL Server 2012 nefunguje?

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


  1. jak nahradit text v buňce daty v jiné tabulce v mysql

  2. SQL získá poslední zprávy od/k určitému uživateli

  3. Zdá se, že webová aplikace [] spustila vlákno s názvem [vlákno čištění opuštěného připojení] com.mysql.jdbc.AbandonedConnectionCleanupThread

  4. Efektivní způsob, jak vytáhnout data z druhé databáze?