Java Hibernate与SQL Server 2012无法正常工作?

我有一个Java Hibernate项目配置,它与SQL Server 2008 R2配合使用,现在有了新的OS 8.1(从7开始)和SQL Server 2012(快速),我无法连接到SQL服务器。

因为它适用于2008 R2,所以/应该在语法上正确的相关配置:

datasource.properties

jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver jdbc.url=jdbc:jtds:sqlserver://localhost:1433/dbname;instance=SQLEXPRESS jdbc.username=auser jdbc.password=xyz 

我尝试了两种方言org.hibernate.dialect.SQLServerDialect在2008 R2中工作。

 hibernate.hbm2ddl.auto=create-drop hibernate.dialect=org.hibernate.dialect.SQLServerDialect #hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect hibernate.show_sql=true 

springConfiguration.xml

       

SQL Server 2012安装了混合模式身份validation,SQL Server Management Studio连接没有问题(有或没有实例名称)。

我已经更新了SQLEXPRESSSQL Server Network Configuration

SQLEXPRESS的协议:

TCP/IP Enabled以及所有TCP/IP Properties - TCP Port到1433的TCP/IP Properties - TCP Port

我试过禁用Windows防火墙只是为了测试它是否在路上,但它会导致相同的错误。

我最终添加了防火墙规则,并按照这个优秀的配置SQL Express 2012中的一些步骤来接受远程连接文章 。

错误消息:

 Caused by: java.lang.AbstractMethodError at net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833) 

您的问题是jTDS不支持默认情况下DBCP2validation连接的方式(我假设您使用来自 DBCP2 )。 请参阅下面的解决方案

通常错误堆栈跟踪如下所示:

 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) 

但是,问题与SQL Server版本无关,而与使用的DBCP(Tomcat)版本(或项目部署到的Tomcat服务器版本)无关。

一旦我使用jTDS 1.3.1并且该项目在Tomcat7下工作正常(并且连接到SQLServer 2012)。 当我改为Tomcat 8时,出现了这个错误。

正如jTDS论坛中暗示的那样 ,原因是:

  • Tomcat7使用DBCP 1,Tomcat 8使用DBCP 2
  • DBCP 1.x不同, DBCP 2将调用java.sql.Connection.isValid(int)来validation连接
  • jTDS没有实现.isValid() ,因此jTDS驱动程序不能与DBCP 2一起使用,除非……
  • …除非你设置validationQuery参数,这将使DBCP不能调用.isValid()来测试连接的有效性。

解决方法

因此,解决方法是设置validationQuery参数 ,这将使DBCP2不调用.isValid()来测试连接的有效性。 就是这样:

在Tomcat上

validationQuery="select 1"添加到连接池的Tomcat 标记中,该标记通常位于应用程序或conf/server.xml META-INF/context.xml中:

  

在spring

通过Spring使用DBCP2时,解决方案就是:

  ...   

简单的java代码

 dataSource.setValidationQuery("select 1"); 

似乎jTDS在SQL Server 2012(更新2?)中存在一些问题,或者在2012/8.1发生了一些变化,这些问题之前在2008 R2/7

使用与上面几乎相同的配置并进行一些小的更改 ,我下载并更改了datasource.properties以使用Microsoft JDBC Driver 4.0 for SQL Server 。

 jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=jdbc:sqlserver://localhost:1433; #jdbc.url=jdbc:sqlserver://localhost\dbname:1433; 

我只是将sqljdbc4.jar放在tomcat\lib\以validationMS JDBC驱动程序4.0与SQL Server 2012一起使用所有更新,并且它完美地运行。 方言org.hibernate.dialect.SQLServerDialect也在2012年工作。