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

lko*_*lko 7 java sql-server hibernate jtds sql-server-2012

我有一个Java Hibernate项目配置,它与SQL Server 2008 R2一起使用,现在有了新的OS 8.1(从7开始)和SQL Server 2012(express),我无法连接到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
Run Code Online (Sandbox Code Playgroud)

我试过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
Run Code Online (Sandbox Code Playgroud)

springConfiguration.xml

<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
Run Code Online (Sandbox Code Playgroud)

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

我已经更新了SQL Server Network Configurationfor SQLEXPRESS.

SQLEXPRESS的协议:

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

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

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

错误消息:

Caused by: java.lang.AbstractMethodError
at net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833)
Run Code Online (Sandbox Code Playgroud)

acd*_*ior 23

您的问题是jTDS不支持默认情况下DBCP2验证连接的方式(我假设您使用DBCP2 <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">).请参阅以下解决方案.

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

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)
Run Code Online (Sandbox Code Playgroud)

但是,问题与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)以验证连接
  • jTDS没有实现.isValid(),因此jTDS驱动程序不能与DBCP 2一起使用,除非......
  • ...除非您设置validationQuery参数,这将使DBCP不会调用.isValid()以测试连接的有效性.

解决方法

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

在Tomcat上

添加validationQuery="select 1"<Resource>连接池的Tomcat 标记,通常在META-INF/context.xml您的应用程序中或conf/server.xml:

<Resource ... validationQuery="select 1" />
Run Code Online (Sandbox Code Playgroud)

在春天

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

<bean id="..." ...> 
    ...
    <property name="validationQuery" value="select 1" />
</bean>
Run Code Online (Sandbox Code Playgroud)

简单的java代码

dataSource.setValidationQuery("select 1"); 
Run Code Online (Sandbox Code Playgroud)