在 Java 应用程序中正确设置新的数据库连接?

Correctly setting a new database connection within a Java Application?

我有一个 java 应用程序,如果记录超过一年,我试图在其中标记一个人实体(对应于我的数据库中的 PERSON 行)。 IE。将数据库中的 OBSOLETE 行设置为 "Y".

我收到错误:

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

这是因为我的数据库 idle timeout 设置为 30 分钟,而应用程序 运行 的时间比这更长。

为了尝试解决这个问题,我正在为每个将被标记的人启动和关闭一个 新连接,但是错误仍然存​​在。 我该如何解决这个问题?

方法:

 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>

用户的空闲时间由 Oracle 数据库中的用户配置文件控制。您可以找出用户的个人资料并根据需要增加 IDLE_TIME 或设置为无限制。

SQL> alter profile <profile_name> limit IDLE_TIME unlimited;

请参考以下link。 https://developer.jboss.org/thread/27079

希望对您有所帮助。

但我强烈建议您关闭连接并根据需要重新打开,而不是保持打开状态"always"。

希望对您有所帮助。