【问题标题】:Java Hibernate with SQL Server 2012 not working?Java Hibernate 与 SQL Server 2012 不工作?
【发布时间】:2014-12-11 19:30:51
【问题描述】:

我有一个使用 SQL Server 2008 R2 的 Java Hibernate 项目配置,现在使用新的 OS 8.1(从 7 开始)和 SQL Server 2012(express),我无法连接到 SQL Server。

相关配置是/应该是syntactically correct,因为它适用于 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

<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>

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

我已将SQL Server Network Configuration 更新为SQLEXPRESS

SQLEXPRESS 协议:

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

我尝试禁用 Windows 防火墙只是为了测试它是否存在问题,但它会导致相同的错误。

我最终添加了防火墙规则并遵循了这个出色的 configure SQL Express 2012 to accept remote connections article 中的一些步骤。

错误信息:

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

【问题讨论】:

    标签: java sql-server hibernate sql-server-2012 jtds


    【解决方案1】:

    您的问题是 jTDS 不支持默认情况下 DBCP2 验证连接的方式(我假设您使用来自&lt;bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"&gt; 的 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时,出现了这个错误。

    原因,如hinted in jTDS forums,是:

    • 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" 添加到您的Tomcat &lt;Resource&gt; 连接池标签中,通常在您的应用程序的META-INF/context.xmlconf/server.xml 中:

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

    春天

    通过 Spring 使用 DBCP2 时,解决方案如下:

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

    简单的java代码

    dataSource.setValidationQuery("select 1"); 
    

    【讨论】:

    • 对问题的出色描述。我走了春天的路,效果很好。接受的答案应该被视为一种解决方法,但这触及了核心。
    • 这个属性到底应该添加到哪个bean:会话工厂还是数据源?
    • @fasfsfgs 到数据源
    【解决方案2】:

    jTDS 似乎在 SQL Server 2012(更新 2?)中存在一些问题,或者 2012/8.1 中的某些内容发生了变化,而之前在 2008 R2/7 中可以使用。

    使用与上面几乎相同的配置和couple minor changes,我下载并更改了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\ 以验证 MS JDBC 驱动程序 4.0 是否与所有更新的 SQL Server 2012 一起工作并且运行良好。 org.hibernate.dialect.SQLServerDialect 方言在 2012 年也有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-20
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      相关资源
      最近更新 更多