2009-03-11 13 views
2

Ich habe Probleme beim Festlegen des Transaktions-Timeout für den Ruhezustand auf Orakel. Es funktioniert nicht. Kann jemand helfen? Das "SaveOrUpdate" kehrt nicht innerhalb der angegebenen 10 Sekunden zurück. Es wird sehr lange hängen bleiben. Ich verwende Oracle 10r2.Transaktionszeitüberschreitung funktioniert nicht mit Orakel im Ruhezustand

Hibernate-Konfigurationsdatei

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

Hibernate Klasse

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){} 
      } 
     } 
    } 

} 

Antwort

3

Der Timeout eingestellt werden muss, bevor die Transaktion gestartet wird.

statt

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

versuchen

tran = dbSession.getTransaction(); 
tran.setTimeout(10); 
tran.begin(); 
+0

Leider der späte Antwort. Ich wurde herausgezogen, um an einer anderen Aufgabe zu arbeiten. Ich probierte aus wie Sie vorschlagen. Leider funktioniert die Timeout-Einstellung nicht für die Methode "saveOrUpdate". Die Timeout-Einstellung funktioniert für "Select for update". Ich bin verwirrt, warum es auf diese Art und Weise verhält. – chinhw

0

Verwendet dies JTA? Wenn dies nicht der Fall ist, hat JDBC selbst keine API zum Festlegen eines Transaktionszeitlimits, stattdessen versucht Hibernate dies zu verwalten, indem es überwacht, wie viel von dem angegebenen Zeitlimit verbleibt, wenn eine JDBC-Anweisung in der Transaktion ausgeführt und Statement.setQueryTimeout festgelegt wird. Es könnte sein, dass entweder ein Fehler in dieser Logik vorliegt oder dass der Oracle JDBC-Treiber einen Fehler in Bezug auf das Festlegen des Zeitlimits für Anweisungen hat.

Wenn Sie es ein Hibernate Fehler finden, https://hibernate.onjira.com

Verwandte Themen