2017-02-10 29 views
0

我有一個java應用程序,如果記錄超過一年,我試圖標記一個人實體(對應於我的db中的PERSON行)。即將DB中的OBSOLETE行設置爲「Y」。在Java應用程序中正確設置新的數據庫連接?

我得到的錯誤:

SQL Error: 2396, SQLState: 61000 
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - ORA-02396: exceeded maximum idle time, please connect again 
WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 17008, SQLState: 99999 
ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Closed Connection 

這是因爲我的DB idle timeout設定爲30分鐘,應用程序正在運行的比這更長的時間。

要嘗試解決這個問題,我正在爲每個將被標記的Person啓動和關閉新連接,但是錯誤仍在發生。 我該如何解決這個問題?

方法:

public void flagPersonIfDeletable() { 

     List<String> allPersonIds = getAllPersonIds(); 


     for (String personId : allPersonIds) { 
      try { 
       startNewConnection(); 
       flagPersonById(personId) 

      } finally { 

       closeConnection(); 
      } 
     } 

開始新的連接方法:

public void startNewConnection() { 

      this.Persistence.done(); 
      this.Persistence.unbind(); 
      this.Persistence.entityManager(); 
     } 

關閉連接方法:

public void closeConnection() { 
     if (entityManager() != null && 
       entityManager().isOpen()) { 
      if (entityManager().getTransaction().isActive()) { 
       entityManager().getTransaction().commit(); 
      } 
      entityManager().close(); 
     } 
    } 

我的persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 

    <persistence-unit name="myPersistence"> 
     <class>com.my.package.PersonEntity</class> 
     <properties> 
      <property name="hibernate.show_sql" value="false"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> 
      <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> 
      <property name="hibernate.connection.provider_class" value="org.hibernate.c3p0.internal.C3P0ConnectionProvider"/> 
      <property name="hibernate.c3p0.max_size" value="1"/> 
      <property name="hibernate.c3p0.min_size" value="1"/> 
      <property name="hibernate.c3p0.acquire_increment" value="1"/> 
      <property name="hibernate.c3p0.idle_test_period" value="300"/> 
      <property name="hibernate.c3p0.max_statements" value="0"/> 
      <property name="hibernate.c3p0.timeout" value="0"/> 
      <property name="hibernate.c3p0.unreturnedConnectionTimeout" value="30000"/> 
      <property name="hibernate.c3p0.dataSourceName" value="JPA"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

回答

0

請參考下面的鏈接。 https://developer.jboss.org/thread/27079

我希望這會有所幫助。

但我強烈建議您關閉連接並根據需要重新打開,而不要保持「始終」打開。

我希望這個幫助。

0

用戶的空閒時間由Oracle數據庫中的用戶配置文件控制。你可以找到用戶的個人資料,並增加IDLE_TIME或如果你願意無限制。

SQL> alter profile <profile_name> limit IDLE_TIME unlimited; 
相關問題