¿Cómo determinar el tamaño del grupo de conexiones mediante programación?

¿Hay alguna forma de determinar el tamaño del grupo de conexión de la base de datos (conexión en uso / conexión restante en el grupo de conexión) mediante programación? Estamos usando Hibernate con C3P0.

Estamos enfrentando problemas al conectarnos a db. Se produce la siguiente excepción y los datos no se guardan en db.

1005, MA, 19/09/11 09: 39: 14, com.novosys.gtw.business.frontend.SnapshotMessageBusiness.save, Mayor: No se puede abrir la conexión
org.hibernate.exception.GenericJDBCException: no se puede abrir la conexión
    en org.hibernate.exception.SQLStateConverter.handledNonSpecificException (SQLStateConverter.java:126)
    en org.hibernate.exception.SQLStateConverter.convert (SQLStateConverter.java:114)
    en org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:66)
    en org.hibernate.exception.JDBCExceptionHelper.convert (JDBCExceptionHelper.java:52)
    en org.hibernate.jdbc.ConnectionManager.openConnection (ConnectionManager.java:449)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1354)
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342)
    at $Proxy0.beginTransaction(Unknown Source)
    at com.novosys.gtw.util.base.BaseBusiness.save(BaseBusiness.java:199)
    at com.novosys.gtw.business.backend.receivesnapshotmessage.filter.SaveMessageFilter.decode(SaveMessageFilter.java:102)
    at org.apache.mina.filter.codec.demux.DemuxingProtocolCodecFactory$ProtocolDecoderImpl.doDecode(DemuxingProtocolCodecFactory.java:292)
    at org.apache.mina.filter.codec.CumulativeProtocolDecoder.decode(CumulativeProtocolDecoder.java:133)
    at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:158)
    at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
    at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
    at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
    at com.novosys.gtw.business.backend.receivesnapshotmessage.filter.WhitelistFilter.messageReceived(WhitelistFilter.java:231)
    at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
    at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
    at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
    at com.novosys.gtw.business.backend.receivesnapshotmessage.filter.MoniterFilter.messageReceived(MoniterFilter.java:92)
    at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
    at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
    at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
    at org.apache.mina.filter.executor.ExecutorFilter.processEvent(ExecutorFilter.java:220)
    at org.apache.mina.filter.executor.ExecutorFilter$ProcessEventsRunnable.run(ExecutorFilter.java:264)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
    at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
    at java.lang.Thread.run(Thread.java:595)
Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!
    at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
    at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    ... 31 more
Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
    ... 34 more

Intentamos resolverlo aumentando el tamaño del grupo de conexiones y también aumentando el no. de conexiones disponibles a nivel de MySQL, pero inútiles. Ahora estamos intentando depurarlo para ver si se debe al tamaño del grupo de conexiones o al tamaño de la conexión MySQL. Queremos registrar no. de conexión disponible / en uso en el tamaño del grupo de conexiones, pero no pudo obtener ninguna ayuda de Google.

Entorno: Java, Hibernate, C3P0, MySQL

Session session = null;
Transaction transaction = null;

try {
            session = HibernateUtil.getSessionFactory(datasource).getCurrentSession();
            transaction = session.beginTransaction();
            // db save called here
            session.getTransaction().commit();
        } catch (Exception e) {
            Logger.write(LoggerConstant.MAJOR_ERROR, e.getMessage(), e, methodName);
        } finally {
            try {
                if ((transaction != null) && (transaction.isActive())) {
                    transaction.rollback();
                }
            } catch (Exception e) {
                Logger.write(LoggerConstant.CRITICAL_ERROR, e.getMessage(), e, methodName);
            }
            try {
                if ((session != null) && (session.isOpen())) {
                    session.close();
                }
            } catch (Exception e) {
                Logger.write(LoggerConstant.CRITICAL_ERROR, e.getMessage(), e, methodName);
            }
        }
Respuesta 1

Además de lo que ex0du5 ha sugerido, el rastro de excepción también sugiere lo siguiente:

Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
  • Esto implica que el grupo de conexiones no pudo adquirir una nueva conexión DESDE LA BASE DE DATOS.
  • Consulte el registro de MySQL para ver si hay algún error.
  • Verifique el tamaño máximo del grupo de conexión y el número máximo de configuración de conexión en la configuración de mysql. (Es menos probable que el tamaño del grupo de conexiones sea más que la conexión máxima en la configuración de mysql, pero por favor asegúrese de esto)

También hay una manera en la que puede monitorear todos los parámetros (incluida la configuración de conexión máxima) del grupo de conexiones C3P0.

Respuesta: 2

No creo que su problema sea el grupo de conexiones, per se, pero en general una pérdida de conexión. Este problema se relaciona comúnmente con el uso de HibernateDaoSupport.getSession()sin emparejar correctamente HibernateDaoSupport.releaseSession(). En general, quieres algo como

public SomeObject getSomething() 
{ 
    Session session = null;
    try 
    {
        session = this.getSession();
        Query query = session.createSQLQuery("SELECT * FROM SomeTable WHERE SomeClause").addEntity(SomeObject.class); 

        // extract object from query 

        return someObject; 
    } 
    finally 
    {
        if (session != null) 
            this.releaseSession(session);
    }        
}

Esto se puede automatizar mediante el uso de HibernateCallback. Para ello, proporcione la consulta a la this.getHibernateTemplate().executeFindque utilizará una sesión en Hibernate con gestión de recursos automatizada.

Respuesta: 3

¿Cómo puedo hacer esto? Básicamente: hay 2 imágenes y quiero que se caigan en una línea y aparecerán al azar de las 2 imágenes Así que, como Girl Girl Boy Girl Boy Y simplemente se caerán ...

He estado luchando con bloqueos ocasionales de JVM cuando uso AffineTransformOp para filtrar la imagen por un tiempo, y me preguntaba si alguien puede ayudarme. He enviado un informe de error a Oracle a ...

Estoy estudiando el código de muestra de la última respuesta en esta publicación para ver cómo hacer un buen botón intermitente. Ese código de muestra usa el siguiente código para especificar los colores: for (int i = 0; i ...

Estoy usando Flex, GraniteDS y Javа. Flex está enviando la fecha correctamente en el horario de verano, por ejemplo, "10 de septiembre 10:00:00 UTC-7", pero después de todo, estoy recibiendo la misma fecha pero en el horario estándar "...