【发布时间】:2015-03-17 17:39:52
【问题描述】:
我正在尝试以一种方法对数据库执行 10 次获取。 我正在使用带有 c3p0 0.9.5 的 Hibernate 3.5.x 和 Spring 3.2.13。
我的 hibernate.cfg.xml 包含以下内容:
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.min_size">10</property>
<property name="hibernate.c3p0.timeout">600</property>
在 c3p0 的调试中这一切都很好:
[managed: 10, unused: 0, excluded: 0]
[managed: 10, unused: 1, excluded: 0]
[managed: 10, unused: 2, excluded: 0]
[managed: 10, unused: 3, excluded: 0]
[managed: 10, unused: 4, excluded: 0]
[managed: 10, unused: 5, excluded: 0]
[managed: 10, unused: 6, excluded: 0]
[managed: 10, unused: 7, excluded: 0]
[managed: 10, unused: 8, excluded: 0]
[managed: 10, unused: 9, excluded: 0]
这一切都发生得非常快(不到 0.5 秒)
但如果我添加一个额外的 get 即 11,那么我会得到以下结果:
[managed: 10, unused: 0, excluded: 0] repeatedly
在连接超时之前它不会改变。
我正在像这样使用 Springs 事务管理器:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
并使用以下基本上调用 findOne()
public abstract class AbstractDAO<T extends Serializable> {
private Class< T > clazz;
@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void setClazz(final Class<T> clazzToSet) {
clazz = clazzToSet;
}
@Transactional
public T findOne(final long id) {
return (T) getCurrentSession().get(clazz, id);
}
...
}
请告诉我哪些其他信息可能有助于诊断。
我可能做错了什么?
【问题讨论】:
-
你有没有做connection.close()来释放它?
-
我已经用事务管理器信息更新了我的问题。这段代码还需要关闭吗?
标签: java spring hibernate c3p0