Спящий |Ошибка источника данных JBOSS MSSQL - PullRequest
1 голос
/ 21 апреля 2011

Я получаю следующее исключение, когда пытаюсь зафиксировать базу данных

    java.sql.SQLException: You cannot commit with autocommit set!
        at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.jdbcComm
it(BaseWrapperManagedConnection.java:545)
        at org.jboss.resource.adapter.jdbc.WrappedConnection.commit(WrappedConne
ction.java:334)
        at net.sf.hibernate.id.TableGenerator.generate(TableGenerator.java:126)
        at net.sf.hibernate.id.TableHiLoGenerator.generate(TableHiLoGenerator.ja
va:59)

вот мой JBOSS (jboss-4.0.5.GA) mssql-ds.xml: -

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
  <jndi-name>TESTDS</jndi-name>
  <connection-url>jdbc:sqlserver://localhost:1433;DatabaseName=TESTDB</connection-url>
  <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
  <user-name>sa</user-name>
  <password>password</password>
  <check-valid-connection-sql>SELECT 1 FROM sysobjects</check-valid-connection-sql>
  <metadata>
      <type-mapping>MS SQLSERVER2000</type-mapping>
  </metadata>
  </local-tx-datasource>
</datasources> 

и вот где моя операция коммита (с транзакцией): -

  public synchronized void commitTransaction() throws TransactionException {
    Transaction tx = (Transaction) localTransaction.get();
    Session session = (Session) localSession.get();
    try {
      tx.commit();
    }
    catch (HibernateException e) {
      log.error("Error closing the persistence when commiting.", e);
      rollbackTransaction();
      throw new TransactionException(e);
    }
    finally {
      try {
        session.close();
      }
      catch (HibernateException e) {
        log.fatal("Session could not be closed !!!", e);
      }
      localSession.set(null);
      localTransaction.set(null);
    }
    log.info("Commiting transaction with thread : " + Thread.currentThread());
  }

ОБНОВЛЕНИЕ: Файл конфигурации Hibernate (hibernate.cfg.xml)

<!-- SQLSERVER configuration -->

<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>

<property name="connection.datasource">java:/TESTDS</property>

<property name="connection.pool_size">100</property>
<property name="statement_cache.size">200</property>

    <property name="transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactory</property>

<property name="show_sql">false</property>
<property name="use_outer_join">true</property>

    <!-- Hibernate mapping files configuration -->

           ..............

    <!-- Hibernate mapping files configuration -->

Я попытался выполнить поиск по всей сети, но не смог найти решение этой проблемы.

Спасибо.

Ответы [ 4 ]

1 голос
/ 23 марта 2012

Вы не можете управлять транзакцией с помощью API JDBC при использовании соединения из источника данных, управляемого контейнером JavaEE.

По умолчанию контейнер решает принять (или выполнить откат), когда ваш бизнес-код закончен, либо он записан в виде методов Servlet, MessageDrivenBean onMessage или EJB.

Если вы хотите проверить состояние транзакции и в конечном итоге решить пометить его как откат - так как поведение контейнера по умолчанию заключается в фиксации - вы должны получить объект UserTransaction из JDNI в сервлете.

Для EJB вы можете получить этот объект UserTransaction из контекста , который экземпляр получает с соответствующим установщиком. Но для этого требуется установить режим транзакции как «управляемый компонентом» с аннотацией TransactionManagement или в дескрипторе развертывания.

0 голосов
/ 25 апреля 2011

Программный код управления транзакциями пугает меня.

Я предлагаю вам попробовать Spring. Управление декларативными транзакциями .

Вы также должны установить в своем hibernate.cfg.xml:

<property name="hibernate.connection.autocommit">false</property>
0 голосов
/ 01 мая 2011

У меня была похожая проблема несколько лет назад, и я правильно помню, что сценарий был следующим:

1) some ejb or web applications grabs a connection from jboss pool
2) it sets autocommit to true does some operations with it and the puts it back to pool
3) your ejb grabs the same connection from jboss pool
4) it's previous state of autocommit is set to true, thus transactions using these connection fail

Чтобы преодолеть эту проблему, вы должны вернуть autocommit к его предыдущему значению, прежде чем закрыть соединение, ввсе ваши собственные jdbc код

0 голосов
/ 22 апреля 2011

Вы пробовали установить

hibernate.connection.autocommit = false?

Взято из документации спящего режима .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...