目前不太了解这些设置,想知道是否有人可以指出我正确的方向。
我有以下内容,我认为基本上是在说
1:最小池连接数 = 5 2:最大池连接数 = 10 3:空闲连接应保持打开多长时间,5 秒(此时它关闭并再次可用。
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb" />
<property name="user" value="root" />
<property name="password" value="password" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="maxIdleTime" value="5" />
<property name="maxStatements" value="0" />
</bean>
但是在我的简单小测试应用程序中,它在测试表上运行一个简单的选择 where id = 1,一旦我到达我的第 11 个“搜索”,它就会挂起。
为什么我最多只有 10 个连接,即使我等待超过 5 秒,为什么没有一个连接被释放?
-- 我的课程片段:
public Object readObject(SessionFactory sessionFactory, String hql, Map<String,Object> args) {
session = this.openHibernateSession(sessionFactory);
Query query = session.createQuery(hql);
Iterator<Entry<String, Object>> it = args.entrySet().iterator();
while (it.hasNext()) {
Entry<String, Object> entry = it.next();
query.setParameter(entry.getKey(), entry.getValue());
}
@SuppressWarnings("unchecked")
List<Object> list = query.list();
this.closeHibernateSession(sessionFactory); // I don't even know if I should need this!
if (list!=null && list.size() > 0) {
return list.get(0);
} else {
log4j.warn("readObject: List is NULL.");
return null;
}
}
protected Session openHibernateSession(SessionFactory sessionFactory) {
Session session = null;
try {
session = sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
session = sessionFactory.openSession();
}
return session;
}
protected void closeHibernateSession(SessionFactory sessionFactory){
Session session;
try {
if (sessionFactory.getCurrentSession()!=null) {
session = sessionFactory.getCurrentSession();
session.close();
}
} catch (HibernateException ex) {
log4j.warn("Failed to close current session, set session to null.", ex);
session = null;
}
}
提前喝彩。
是的,这几乎是一团糟,所以我将其剥离并找到了几个示例并重新开始。
@Transactional
public class UserDaoImpl UserDao {
@Autowired
private SessionFactory sessionFactory;
private Session session;
private Query query;
@Override
public UserDetails getUserDetails(Integer id) {
session = sessionFactory.getCurrentSession();
Query query = session.createQuery("FROM UserDetails WHERE id = "+id);
UserDetails userDetails = (UserDetails) query.list().get(0);
return userDetails;
}
}
并对我的 application-context.xml 进行了一些更改
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven/>
它现在似乎可以工作了,因为我在 10 次连接后没有挂起。
只是想知道我是否需要打扰 session.close(); 或者现在应该已经处理了吗?
干杯,伙计们。