Вопрос:

Java Hibernate с SQL Server 2012 не работает?

java sql-server hibernate sql-server-2012 jtds

15374 просмотра

2 ответа

5663 Репутация автора

У меня есть конфигурация проекта Java Hibernate, которая работала с SQL Server 2008 R2, теперь с новой ОС 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

<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, чтобы проверить, не мешает ли он, но приводит к той же ошибке.

Я закончил тем, что добавил правила брандмауэра и выполнил некоторые из шагов в этой отличной настройке SQL Express 2012 для принятия статьи об удаленных подключениях .

Сообщение об ошибке:

Caused by: java.lang.AbstractMethodError
at net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833)
Автор: lko Источник Размещён: 16.10.2014 12:20

Ответы (2)


0 плюса

5663 Репутация автора

Похоже, что у jTDS есть некоторые проблемы с SQL Server 2012 (обновление 2?) Или что-то изменилось, в 2012/8.1чем ранее работал 2008 R2/7.

Используя почти ту же конфигурацию, что и выше, с несколькими небольшими изменениями , я загрузил и изменил datasource.properties, чтобы использовать Microsoft JDBC Driver 4.0 для 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 году.

Автор: lko Размещён: 16.10.2014 12:20

23 плюса

93394 Репутация автора

Решение

Ваша проблема в том, что 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)

Проблема, однако, связана не с версией SQL Server, а с используемой версией DBCP (Tomcat) (или версией сервера Tomcat, на которой развернут проект).

Когда-то я использовал jTDS 1.3.1, и проект работал нормально (и также был подключен к SQLServer 2012) под Tomcat7. Когда я перешел на 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" />

По весне

При использовании DBCP2 через Spring, решение заключается в следующем:

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

На простой код Java

dataSource.setValidationQuery("select 1"); 
Автор: acdcjunior Размещён: 08.01.2015 06:43
Вопросы из категории :
32x32