Hibernate和Postgresql

时间:2015-04-23 13:23:07

标签: hibernate postgresql vaadin connection-pooling postgresql-9.1

我使用Hibernate 4.3.8与PostgreSQL数据库一起使用Vaadin 7.4.4开发Web应用程序。

我面临一些问题,老实说,我认为这些问题与Connection有关。

随机地,当我尝试登录我的webapp时,浏览器会在加载"时停滞不前,而且它不会更进一步。这只在我从服务器(ubuntu)重新启动PostgreSQL服务时停止。

我一直在努力的是试图建立连接池的hibernate配置文件,但我还没有成功:我已尝试使用hibernate的内置连接池(不在hibernate.cfg.xml中引入任何池配置,正如它所说的那样,不应该在生产模式中使用),DBCP和C3p0。

我附上了hibernate.cfg.xml文件,万一有人借给我一把:

    <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration
        PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- POSTGRESQL -->
            <!-- POSTGRESQL Database connection settings -->
            <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>

            <!-- Server config -->
            <property name="hibernate.connection.url">jdbc:postgresql://_server-url_</property>
            <property name="hibernate.connection.username">_user_</property>
            <property name="hibernate.connection.password">_pass_</property>

            <!-- POSTGRESQL SQL Dialect -->
            <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <!-- POSTGRESQL -->

        <!-- C3p0 pool connection manager -->
<!--         <property name="hibernate.c3p0.min_size">5</property> -->
<!--         <property name="hibernate.c3p0.max_size">1000</property> -->
<!--         <property name="hibernate.c3p0.timeout">0</property> -->
<!--         <property name="hibernate.c3p0.max_statements">100</property> -->
<!--         <property name="hibernate.c3p0.idle_test_period">3000</property> -->

        <!--connection pool--> 
<!--        <property name="hibernate.dbcp.maxActive">10</property>  -->
<!--        <property name="hibernate.dbcp.whenExhaustedAction">1</property>  -->
<!--        <property name="hibernate.dbcp.maxWait">20000</property>  -->
<!--        <property name="hibernate.dbcp.maxIdle">10</property>  -->

        <!-- prepared statement cache--> 
<!--        <property name="hibernate.dbcp.ps.maxActive">10</property>  -->
<!--        <property name="hibernate.dbcp.ps.whenExhaustedAction">1</property>  -->
<!--        <property name="hibernate.dbcp.ps.maxWait">20000</property>  -->
<!--        <property name="hibernate.dbcp.ps.maxIdle">10</property>  -->

        <!-- optional query to validate pooled connections:--> 
<!--        <property name="hibernate.dbcp.validationQuery">select 1</property>  -->
<!--        <property name="hibernate.dbcp.testOnBorrow">true</property>  -->
<!--        <property name="hibernate.dbcp.testOnReturn">true</property>  -->

        <!-- SQL to stdout logging -->
<!--         <property name="show_sql">true</property> -->
<!--         <property name="format_sql">true</property> -->
<!--         <property name="use_sql_comments">true</property> -->


        <!-- class mappings go here ... -->

    </session-factory>
</hibernate-configuration>

如您所见,C3p0和DBCP配置行已注释。

此时,我不知道这个问题是否与Hibernate有关,或者可能与PostgreSQL服务器的某些方面有关。

有人可以帮帮我吗?提前谢谢!

编辑1

@CraigRinger也许我管理错了什么?为了管理数据库访问,我有一个PtDAO类,从中我通过Hibernate执行对数据库的每次访问(通常我使用HQL)。它遵循Singleton模式。

构造函数是谁打开hibernate的配置文件并打开会话:

    private PtDao() {

    Configuration configuration = new Configuration()
            .configure("hibernate.cfg.xml"); // configures settings from
                                                // hibernate.cfg.xml

    StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();

    // If you miss the below line then it will complain about a missing
    // dialect setting
    serviceRegistryBuilder.applySettings(configuration.getProperties());

    serviceRegistry = serviceRegistryBuilder.build();

    factory = configuration.buildSessionFactory(serviceRegistry);

    this.openSession();

}

打开/关闭会话和开始/提交/回滚事务的方法:

private void openSession() {
    session = factory.openSession();
}

public void closeSession() {
    session.close();
}

private void beginTransaction() {
    this.tx = null;
    this.tx = session.beginTransaction();
}

private void commitTransaction() {
    this.tx.commit();
}

private void rollbackTransaction() {
    if (this.tx != null)
        this.tx.rollback();
}

我是否在连接时出错了?我已经意识到,当用户按下注销按钮时,我是否应该调用closeSession()?

提前致谢。

0 个答案:

没有答案