我使用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()?
提前致谢。