sql >> Databasteknik >  >> RDS >> Sqlserver

Fungerar inte Java Hibernate med SQL Server 2012?

Ditt problem är att jTDS inte stöder det sätt som DBCP2 validerar en anslutning som standard (jag antar att du använder DBCP2 från <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"> ). Se lösningen nedan.

Vanligtvis är stacktrace-felet som visas:

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)

Problemet är dock inte relaterat till SQL Server-versionen, utan till DBCP-versionen (Tomcat) som används (eller Tomcat-serverversionen som projektet är distribuerat till).

En gång använde jag jTDS 1.3.1 och projektet fungerade bra (och kopplat till SQLServer 2012 också) under Tomcat7. När jag bytte till Tomcat 8 dök det felet upp.

Anledningen, som antydde i jTDS-forum , är:

  • (Tomcat7 använder DBCP 1 och Tomcat 8 använder DBCP 2 )
  • Till skillnad från DBCP 1.x , DBCP 2 anropar java.sql.Connection.isValid(int) för att validera anslutningen
  • jTDS implementerar inte .isValid() , så jTDS-drivrutinen fungerar inte med DBCP 2, om inte...
  • ...om du inte ställer in validationQuery parameter, vilket gör att DBCP inte anropar .isValid() för att testa anslutningens giltighet.

Lösning

Så lösningen är att ställa in validationQuery parameter , vilket gör att DBCP2 inte anropar .isValid() för att testa anslutningens giltighet. Så här gör du:

På Tomcat

Lägg till validationQuery="select 1" till din Tomcat <Resource> tagg för anslutningspool, som vanligtvis finns i META-INF/context.xml av din app eller conf/server.xml :

<Resource ... validationQuery="select 1" />

På våren

När du använder DBCP2 till Spring är lösningen något runt:

<bean id="..." ...> 
    ...
    <property name="validationQuery" value="select 1" />
</bean>

På enkel java-kod

dataSource.setValidationQuery("select 1"); 


  1. MySQL-typ för att lagra ett år:Smallint eller Varchar eller Date?

  2. Tomcat6 kan inte ansluta till MySql (drivrutinen har inte tagit emot några paket från servern)

  3. skicka LIMIT som parametrar till MySQL sproc

  4. Är det bra att använda en huvudtabell för delade kolumner för en hel databas?