【发布时间】:2014-07-03 09:31:52
【问题描述】:
我有一个使用 Hibernate 4 的 Spring 应用程序。Hibernate 配置位于我的 application-config.xml 中,如下所示:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.mycompany.esb.jpa</value>
</list>
</property>
</bean>
在 com.mycompany.esb.jpa 包中,我有以下类,该包中的所有其他类都是其子类。
package com.mycompany.esb.jpa.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class HibernateBaseDAO {
@Autowired
protected SessionFactory sessionFactory;
protected Session getSession() {
return sessionFactory.openSession();
}
}
这是我为本示例简化的类之一。
package com.mycompany.esb.jpa.dao;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.springframework.stereotype.Component;
import com.mycompany.esb.jpa.entity.ServicesEntity;
@Component("servicesDAO")
public class ServicesDAOImpl extends HibernateBaseDAO implements ServicesDAO {
@Override
public List<ServicesEntity> getAllServices(double daysPrevious, double hoursToShow) {
try {
Query query = getSession().createQuery("FROM ServicesEntity e "
+ "WHERE e.responseTime >= (sysdate - (" + daysPrevious + " + " + hoursToShow + "/24)) "
+ "AND e.responseTime < (sysdate - " + daysPrevious + ") "
+ "GROUP BY e.domainName, e.serviceName, e.operationName, e.elapsedTime, e.serviceTimestamp, "
+ "e.id, e.responseTimeAverage, e.responseTime, e.requestSizeAverage, e.responseSizeAverage, e.requestCount "
+ "ORDER BY e.domainName, e.serviceName, e.operationName, e.serviceTimestamp");
@SuppressWarnings("unchecked")
List<ServicesEntity> services = (List<ServicesEntity>) query.list();
return services;
} catch (HibernateException hex) {
hex.printStackTrace();
}
return null;
}
}
我遇到的问题是,当部署到 JBoss EAP 时,每次调用 getAllServices() 方法时,它都会从 JDBC 池中获取一个新连接并且永远不会释放它。因此,当容器 JDBC 池最多有 5 个连接时,在 5 次查询之后,后续查询会因为没有可用连接而超时。连接池不应该由 Hibernate SessionFactory 对象管理吗?我需要明确关闭连接吗?
【问题讨论】:
-
为什么要这样做?您没有事务设置,然后您执行
openSession指示您想要管理自己的会话。设置事务并改用getCurrentSession。
标签: spring hibernate jdbc jboss6.x