2012-09-20 12 views
31

Tengo problemas con la configuración de c3p0. Publiqué una pregunta la semana pasada: C3P0 Configurations! Where and How?, pero no recibí respuesta. Se agradece cualquier ayuda.Mejor configuración de c3p0

+7

Esta fue una gran pregunta, muy útil. Me habría ahorrado mucho esfuerzo si hubiera más respuestas aquí. ¡Gracias por nada, moderadores! –

+0

Estoy de acuerdo. esta fue una buena pregunta ... algunos moderadores rápidamente arruinaron una buena pregunta. –

Respuesta

2

La mejor configuración es configurar JPA para usar el entorno contenedor para obtener DataSource.

Esto permite que el contenedor proporcione la agrupación de la conexión en lugar de configurarlo directamente en su proyecto JPA.

No indica con qué contenedor está trabajando. Casi siempre uso c3p0 con aplicaciones autónomas, como aplicaciones de servidor o escritorio Java SE. También lo uso con Spring framework.

Cuando se utiliza un contenedor como Servlet (Tomcat/Jetty) o Application Server (como Glashfish o JBoss AS), estos ya proporcionan una implementación del colector de conexión DataSource que normalmente no es c3p0 pero proporciona una función equivalente.

Nunca he intentado configurar un colector de conexiones dentro de un proyecto JPA porque esto significa editar la configuración para personalizarla para cada entorno en el que necesita ejecutarse. Esto es un dolor de cabeza así que es mejor que la parte JPA reciba el DataSource para usar durante bootstrap.

+0

Gracias por su respuesta. Estoy usando hibernate3.0, c0p3-0.9.1 y Tomcat. ¿Tiene alguna muestra para su estrategia para configurar el grupo de conexiones? Es muy importante evitar que MySQL rompa las conexiones inactivas después de 8 horas, si tus actividades pasadas lo ayudan, será bienvenido. –

+0

Incluso si MySQL rompe las conexiones inactivas después de 8 horas, c3p0 se puede configurar para probar siempre la conexión antes de su uso, así como para seguir probando cuando está inactiva. ¿Buscó StackOverflow para esa información? http://stackoverflow.com/questions/10526313/zombie-connections-to-mysql-using-c3p0-with-tomcat (hay muchas otras referencias, debe comenzar por decirle a Tomcat que no use C3P0 y luego al configurar el params según lo necesite para su despliegue de WAR, luego cambie su proyecto de JPA para usar la búsqueda JNDI). –

+0

Sé que la conexión de prueba puede ser útil y tengo configuraciones c3p0, pero no estoy seguro de que estas configuraciones sean verdaderas y funcionen. Por favor, eche un vistazo a mi última pregunta stackoverflow.com/questions/12446266/c3p0-configurations-where-and-how –

44

Esta es una configuración que estoy usando que mantiene los recursos al mínimo. Por supuesto que querrá adaptar su aplicación para utilizar los recursos que necesita ...

Referencia: http://www.mchange.com/projects/c3p0/index.html

  • testConnectionOnCheckin valida la conexión cuando se devuelve a la piscina. testConnectionOnCheckOut, aunque aseguraría conexiones activas antes del uso, sería demasiado costoso de hacer.
  • idleConnectionTestPeriod establece un límite de cuánto tiempo una conexión permanecerá inactiva antes de probarla. Sin preferredTestQuery, el valor predeterminado es DatabaseMetaData.getTables(), que es independiente de la base de datos, y aunque es una llamada relativamente cara, probablemente sea adecuada para una base de datos relativamente pequeña. Si está paranoico con el rendimiento, utilice una consulta específica para su base de datos (es decir, preferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnections devolverá el connectionCount a minPoolSize después de un aumento en la actividad.

La configuración siguiente configura poolsize entre 3-20. Las conexiones inactivas se vuelven a probar cada 5 minutos para mantenerlas activas. Debido a idleConnectionTestPeriod, esto solo mantendrá viva la cantidad mínima de conexiones. Si hay más de 3 conexiones en la marca de 4 minutos, se eliminan esas conexiones liberando recursos al mínimo.

El uso de maxIdleTimeExcessConnections y idleConnectionTestPeriod niega la necesidad de maxIdleTime

<Context docBase="myapp" path="/myapp" reloadable="true"> 
    <Resource description="My DB Datasource" name="jdbc/mydb" 
     auth="Container" factory="org.apache.naming.factory.BeanFactory" 
     type="com.mchange.v2.c3p0.ComboPooledDataSource" 
     user="myuser" password="******" 
     minPoolSize="3" 
     maxPoolSize="20" 
     acquireIncrement="1" 
     driverClass="com.mysql.jdbc.Driver" 
     jdbcUrl="jdbc:mysql://localhost:3306/mydb" 
     testConnectionOnCheckin="true" 
     idleConnectionTestPeriod="300" 
     maxIdleTimeExcessConnections="240" 
    /> 
</Context> 
+0

Gracias por su respuesta, Domenic. Redirige la referencia que señalaste y soy consciente del comportamiento de las propiedades de c3p0, pero en mi proyecto, creo, estas propiedades, la configuración en mi otra publicación no hace nada porque no están en perfecto estado. y necesitan otras propiedades o se deben establecer en otro archivo de configuración. –

+0

@Domenic: Tengo el mismo problema, no puedo crear una nueva conexión. Aquí están mis todos los detalles. Siento que puedes resolver un problema en mi c3p0. http://stackoverflow.com/questions/38994849/unable-to-get-jdbc-connection-even-pool-shows-only-few-connections-are -used –

Cuestiones relacionadas