【发布时间】:2015-10-13 10:54:45
【问题描述】:
我对这个事实有点迷茫:
show status like 'con%';
+-----------------------------------+-------+
| Variable_name | Value |
+-----------------------------------+-------+
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 0 |
| Connection_errors_peer_address | 0 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 10535 |
+-----------------------------------+-------+
我在这里阅读了一些类似的问题,但是在那些不是我的情况下的问题,所以我在这里。
我使用 MySQL 和 Hibernate。在我的 webapp 中有这个静态 HibernateUtil 类来访问数据库:
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final Logger log = Logger.getLogger(HibernateUtil.class);
private static SessionFactory sessionFactory;
static {
try {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
} catch (Throwable ex) {
// error handling
}
}
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException {
Session s = null;
try {
s = (Session) session.get();
} catch(Exception e) {
// error handling
}
// Open a new Session, if this thread has none yet
if (s == null) {
try {
s = sessionFactory.openSession();
} catch(Exception e) {
// error handling
}
try {
s.getTransaction();
} catch(Exception e){
// error handling
}
Transaction tx = null;
while(tx==null){
try {
tx = s.beginTransaction();
// Store it in the ThreadLocal variable
} catch(Exception j) {
// error handling
}
}
session.set(s);
}
return s;
}
public static void closeSession() throws HibernateException {
Session s = (Session) session.get();
if (s != null){
try {
s.getTransaction().commit();
s.close();
} catch(Exception e) {
// error handling
}
}
session.set(null);
}
public static void errorSession() throws HibernateException {
Session s = (Session) session.get();
try {
s.getTransaction().rollback();
s.close();
} catch(Exception e) {
// error handling
}
session.set(null);
}
}
然后我像这个例子一样调用 util 类:
private MyTable getMyTable() {
try {
Session session = currentSession();
// some prepared statement
return myTable;
} catch (HibernateException e) {
errorSession();
return null;
} finally {
closeSession();
}
}
所以基本上我会在成功 (closeSession) 和错误 (errorSession) 时关闭连接。 现在为什么我在 MySQL 控制台中看到这么多连接?
【问题讨论】: