【问题标题】:java.sql.SQLRecoverableException: Closed Connectionjava.sql.SQLRecoverableException:关闭连接
【发布时间】:2013-01-23 08:55:45
【问题描述】:

我正在开发带有 Hibernate 3.3 和 Oracle 11g 的 Struts 2 框架。自 5 个月以来,我的网络项目运行良好。但最近我在一些空闲时间面临 java.sql.SQLRecoverableException: Closed Connection。我将解释以下场景.. 我的 hibernate.cfg.xml 配置是

<property name="hibernate.current_session_context_class">
        thread
    </propert
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">user</property>
<property name="connection.password">user</property>
<property name="connection.driver_class">
        oracle.jdbc.OracleDriver
    </property>
<property name="myeclipse.connection.profile">Oracle</property>
<property name="hibernate.connection.autoReconnect">true</property>
<property name="dialect"> org.hibernate.dialect.Oracle10gDialect </property>

我的 HibernateSessionFactory 配置是

private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;
static {
    try {
        configuration.configure(configFile);
        sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
        System.err
                .println("%%%% Error Creating SessionFactory %%%%");
        //e.printStackTrace();
    }
}
private HibernateSessionFactory() {
}
public static Session getSession() throws HibernateException {
    Session session = (Session) threadLocal.get();

    if (session == null || !session.isOpen()) {
        if (sessionFactory == null) {
            rebuildSessionFactory();
        }
        session = (sessionFactory != null) ? sessionFactory.openSession()
                : null;
        threadLocal.set(session);
    }

    return session;
}
public static void rebuildSessionFactory() {
    try {
        configuration.configure(configFile);
        sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
        System.err
                .println("%%%% Error Creating SessionFactory %%%%");
        //e.printStackTrace();
    }
}
public static void closeSession() throws HibernateException {
    Session session = (Session) threadLocal.get();
    threadLocal.set(null);

    if (session != null) {
        session.close();
    }
}
public static org.hibernate.SessionFactory getSessionFactory() {
    return sessionFactory;
}
public static void setConfigFile(String configFile) {
    HibernateSessionFactory.configFile = configFile;
    sessionFactory = null;
}
public static Configuration getConfiguration() {
    return configuration;
}

那么下面代码运行的时候就报错了

session = HibernateSessionFactory.getSession();
Query query = session.createQuery(SQL_QUERY);
try {
                // session.connection().close();
                System.out.println("CLOSED :"
                        + session.connection().isClosed());
                if (session.connection().isClosed()) {
                    System.out.println("RECONNECTING.......");
                    session.reconnect();
                }
                System.out.println("CLOSED :"
                        + session.connection().isClosed());
            } catch (Exception e1) {

                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
try {
for (Iterator it = query.iterate(); it.hasNext();) {
                    chk = true;
                    ur = (EmagEnterpriseLogin) it.next();
} catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

当上述 sn-p 运行时,即使能够打开会话并成功创建查询,但在迭代查询时失败。第一次来

Caused By:java.sql.SQLRecoverableException: Closed Connection

但在第一次尝试此错误之前,我捕获了 session.Connection.isClosed() 是错误的。但是在第一个错误之后继续出现 SQL State=null 并且从第二次我可以得到 session.Connection.isClosed() 是真的。然后重新连接执行,但仍然重复相同的错误。我也尝试重建 sessionfactory,也失败了。请帮我解决这个问题。

【问题讨论】:

  • 什么是 oracle 错误?
  • org.hibernate.exception.JDBCConnectionException: 无法使用迭代执行查询

标签: java hibernate struts2 oracle11g


【解决方案1】:

最后我发现我的问题的解决方案是使用第三方连接提供程序而不是使用 Hibernate Native 连接提供程序。我使用了 c3p0 Connection provider ,这也给了我一些问题,我也解决了。 c3p0 的参考链接在这里..Hibernate c3p0 Connection NewPooledConnection close Exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2013-12-15
    • 2021-02-03
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多