我有一个可与SQL Server 2008 R2一起使用的Java Hibernate项目配置,现在具有新的OS 8.1(来自7)和SQL Server2012(快速),我无法连接到SQL Server。
自从语法上与2008R2一起使用以来,在语法上正确的相关配置:
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中使用过的方言。
org.hibernate.dialect.SQLServerDialect
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。
SQL Server Network Configuration
SQLEXPRESS
SQLEXPRESS的协议:
TCP/IP Enabled 以及所有的TCP/IP Properties - TCP Port1433。
TCP/IP Enabled
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默认不支持DBCP2验证连接的方式(我假设您使用的DBCP2 <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">)。请参阅下面的解决方案。
<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)
但是,问题与SQL Server版本无关,而与所使用的DBCP(Tomcat)版本(或项目部署到的Tomcat服务器版本)有关。
使用jTDS 1.3.1之后,该项目在Tomcat7下运行良好(并也连接到SQLServer 2012)。当我更改为Tomcat 8时,出现了该错误。
正如jTDS论坛所暗示的,原因是:
java.sql.Connection.isValid(int)
.isValid()
validationQuery
因此,解决方法是 设置validationQuery参数,这将使DBCP2不被调用.isValid()以测试连接的有效性。就是这样:
validationQuery="select 1"将您的Tomcat <Resource>标签添加到连接池中,该标签通常位于META- INF/context.xml您的应用程序中或conf/server.xml:
validationQuery="select 1"
<Resource>
META- INF/context.xml
conf/server.xml
<Resource ... validationQuery="select 1" />
通过Spring使用DBCP2时,解决方案是:
<bean id="..." ...> ... <property name="validationQuery" value="select 1" /> </bean>
dataSource.setValidationQuery("select 1");