sql >> Database teknologi >  >> RDS >> Sqlserver

Java Hibernate med SQL Server 2012 virker ikke?

Dit problem er, at jTDS ikke understøtter den måde, DBCP2 validerer en forbindelse på som standard (jeg går ud fra, at du bruger DBCP2 fra <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"> ). Se løsningen nedenfor.

Normalt er stacktrace-fejlen som vist:

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 er dog ikke relateret til SQL Server-versionen, men til den anvendte DBCP (Tomcat)-version (eller Tomcat-serverversionen, som projektet er implementeret til).

Engang brugte jeg jTDS 1.3.1, og projektet fungerede fint (og også forbundet til SQLServer 2012) under Tomcat7. Da jeg skiftede til Tomcat 8, dukkede den fejl op.

Årsagen, som antydet i jTDS-fora , er:

  • (Tomcat7 bruger DBCP 1 og Tomcat 8 bruger DBCP 2 )
  • I modsætning til DBCP 1.x , DBCP 2 kalder java.sql.Connection.isValid(int) for at validere forbindelsen
  • jTDS implementerer ikke .isValid() , så jTDS-driveren virker ikke med DBCP 2, medmindre...
  • ...medmindre du indstiller validationQuery parameter, som vil få DBCP til ikke at kalde .isValid() for at teste gyldigheden af ​​forbindelsen.

Løsning

Så løsningen er at indstille validationQuery parameter , hvilket vil få DBCP2 til ikke at kalde .isValid() for at teste gyldigheden af ​​forbindelsen. Sådan gør du:

På Tomcat

Tilføj validationQuery="select 1" til din Tomcat <Resource> tag for forbindelsespulje, som normalt er i META-INF/context.xml af din app eller conf/server.xml :

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

Om foråret

Når du bruger DBCP2 til Spring, er løsningen noget omkring:

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

På simpel java-kode

dataSource.setValidationQuery("select 1"); 


  1. HIbernate problem med Oracle Trigger til generering af id fra en sekvens

  2. Geoserver FEJL:funktion postgis_lib_version()

  3. Vælg CIDR, der er inden for IP-området

  4. INDSÆT ved hjælp af LIST i Stored Procedure