Many MySQL connections

I lost this fact a bit:

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 | +-----------------------------------+-------+ 

I read some kind of similar question here, but the problems are in cases where not mine, so I'm here.

I use MySQL and Hibernate. In my webapp there is this static HibernateUtil class for accessing the database:

 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); } } 

Then I call the util class, as in this example:

 private MyTable getMyTable() { try { Session session = currentSession(); // some prepared statement return myTable; } catch (HibernateException e) { errorSession(); return null; } finally { closeSession(); } } 

So basically I close the connection with success (closeSession) and by mistake (errorSession). Now why do I see so many connections in the MySQL console?

+6
source share
2 answers

The meaning of connections is not what you think. As said in docs connections means:

The number of connection attempts (successfully or not deleted) to the MySQL server.

Thus, you do not have 10535 active compounds, as you think.

+3
source

To see the actual connection flows, use:

 SHOW STATUS LIKE 'Threads_connected'; 
+1
source

All Articles