7

我正在使用 oracle 11g、hibernate 3 和 jsf2。我在 was7 上部署了我的应用程序。一切都很顺利,但是当我在 5-6 小时后尝试登录时,它给了我错误

ERROR org.hibernate.util.JDBCExceptionReporter - Io exception: Connection reset by peer: socket write error
[5/28/13 11:31:25:048 IST] 00000024 SystemErr     R org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2231)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
    at org.hibernate.loader.Loader.list(Loader.java:2120)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)

我无法找出如何解决此错误。请帮助我。在此先感谢。

现在我已经通过代码解决了这个问题,但我不知道它是否正确。你会建议我吗,我应该继续这个解决方案。

public class ApplicationUtilityBean implements Serializable {
private SessionFactory sessionFactory;
private AnnotationConfiguration cfg;
public String filePath;
private String realPath = Config.PATH;

public ApplicationUtilityBean() throws URISyntaxException {
    getConnection();
}

public void getConnection() {
    URL r = this.getClass().getClassLoader().getResource("hibernate.cfg.xml");
            cfg = new AnnotationConfiguration();
    cfg.configure(r);
    String pwd = cfg.getProperty("hibernate.connection.password");
    TripleDESEncryption tripledesenc = null;
    try {
        tripledesenc = new TripleDESEncryption();
    } catch (Exception e) {
        e.printStackTrace();
    }
    cfg.setProperty("hibernate.connection.password",
            tripledesenc.decrypt(pwd));
    sessionFactory = cfg.buildSessionFactory();

    System.out.println("cfg: " + cfg);
    System.out.println("sessionFactory: " + sessionFactory);
}

public Session getSession() {
    System.out.println("Going to get session");
    Session session = null;
    try {
        System.out.println("cfg is: " + cfg);
        System.out.println("sessionFactory: " + sessionFactory);
        session = sessionFactory.openSession();
        if(session != null){
            try {
                Transaction trxn = session.beginTransaction();
                Query queryResult = session.createSQLQuery("select * from dual");
                List<GTS_USER>listgtsuser = queryResult.list();     
                                } catch (Exception e) {                 
                e.printStackTrace();
                System.out.println("Creating new connection............");
                session.close();
                sessionFactory.close();
                getConnection();
                session = sessionFactory.openSession();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return session;
}

}

我的休眠配置文件是

<hibernate-configuration>
<session-factory>

    <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property>
    <property name="hibernate.cache.use_query_cache">true</property>
    <property name="hibernate.cache.use_second_level_cache">true</property>

    <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
    <property name="hibernate.connection.url">jdbc:oracle:thin:@xxxxxxxxx:1521:HMS</property>
    <property name="hibernate.connection.username">xxxxx</property>
    <property name="hibernate.connection.password">xxxxxxxxxxx</property>
    <property name="hibernate.connection.pool_size">10</property> 
    <property name="show_sql">true</property>
    <property name="dialect">org.hibernate.dialect.OracleDialect</property>
    <property name="hibernate.hbm2ddl.auto">update</property>
4

3 回答 3

8

您可能面临数据库连接超时。在每个数据库上,当连接打开并且一段时间内没有活动时,都会出现超时。您需要一个连接池管理器。

如果您c3p0正确安装和配置它,它将允许休眠保持您的连接活动和/或在您需要时重新打开它。

这里确实是 MySQL 和 Hibernate 的示例,但它是相同的。您必须包含c3p0.jar并将其添加到您的休眠配置文件中:

<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

确保c3p0.timeout根据您的数据库进行配置!

于 2013-05-28T07:12:08.840 回答
2

这里的问题是空闲连接将被数据库服务器关闭。应用程序不知道它并尝试使用过时的连接(来自初始化期间创建的池)。解决此问题的方法是在使用来自池的连接之前配置连接池以进行活性测试(通常通过触发简单的选择查询)。

如何执行此操作因您设置数据源/连接池的方式而异。如果您提供更多详细信息,我可以提供更具体的说明。

于 2013-05-28T07:11:08.320 回答
1

根据@BalusC

如果您的应用程序应该运行相对较长的时间并经常连接数据库,那么请考虑使用连接池来提高连接性能。如果您的应用程序是 Web 应用程序,请查看应用程序服务器的文档,它通常提供数据源风格的连接池工具。如果它是一个客户端应用程序,那么寻找已经证明其稳健性多年的 3rd 方连接池库,例如 Apache Commons DBCP(常用,用于许多应用服务器)、C3P0(从 Hibernate 知道)和 Proxool(如果你想要XA 连接)。

于 2013-08-06T06:56:15.613 回答