2015-10-13 63 views
6

我有点失去了这个事实:许多MySQL连接

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。在我的web应用程序有这个静态的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控制台中看到如此多的连接?

回答

3

connections的含义并非您所想的。

连接尝试(成功与否)MySQL服务器的数目: 如docsconnections装置所述。

因此,您认为没有10535个活动连接。

+0

愚蠢的我。谢谢! – sebastian

1

要看到实际的连接线程使用:

SHOW STATUS LIKE 'Threads_connected'; 
+0

谢谢。 81开放连接看起来好多了:-) – sebastian