тайм-аут транзакции не работает в спящем режиме с оракулом - PullRequest
2 голосов
/ 11 марта 2009

У меня проблема с установкой тайм-аута транзакции для спящего режима на Oracle. Это не работает. Может кто-нибудь помочь? «SaveOrUpdate» не вернется в течение указанных 10 секунд. Он будет висеть очень долго. Я использую Oracle 10r2.

Файл конфигурации Hibernate

<hibernate-configuration>
<session-factory>
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="connection.url">jdbc:oracle:thin:@9.9.9.9:1521:orcl</property>
    <property name="connection.username">foouser</property>
    <property name="connection.password">foopass</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">false</property>
    <!-- Mapping files -->
    <mapping resource="foo.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Спящий класс

public class foo implements Serializable
{
...
    public void save() throws Exception
    {
        Session     dbSession = null;
        Transaction tran      = null;
        try
        {
            dbSession = PersistenceMgr.getPersistenceMgr().getDbSession();
            tran      = dbSession.beginTransaction();
            tran.setTimeout(10); // 10 seconds
            dbSession.saveOrUpdate(this);
            tran.commit();
        }
        catch (HibernateException e)
        {
            if(tran!=null)
            {
                try{tran.rollback();}
                catch(HibernateException he){}
            }
            ...
        }
        finally
        {
            if( dbSession != null )
            {
                try{dbSession.close();}
                catch(HibernateException e){}
            }
        }
    }

}

Ответы [ 3 ]

3 голосов
/ 20 марта 2009

Время ожидания должно быть установлено до начала транзакции.

вместо

tran = dbSession.beginTransaction();
tran.setTimeout(10);// 10 seconds

попробовать

tran = dbSession.getTransaction();
tran.setTimeout(10);
tran.begin();
0 голосов
/ 03 июня 2012

Это использует JTA? Если нет, то в самом JDBC нет API для установки тайм-аута транзакции, поэтому вместо этого Hibernate пытается управлять этим, отслеживая, какая часть указанного периода тайм-аута остается при выполнении оператора JDBC в транзакции и устанавливая Statement.setQueryTimeout. Возможно, в этой логике есть ошибка или в драйвере JDBC Oracle есть ошибка, связанная с установкой времени ожидания оператора.

Если вы обнаружите, что это ошибка Hibernate, https://hibernate.onjira.com

0 голосов
/ 06 января 2010

Вы можете увидеть это по адресу: http://community.jboss.org/wiki/TransactionTimeout.

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