J'ai du mal avec un problème de configuration de c3p0. j'ai posté une question la semaine dernière
Il s'agit d'une configuration que j'utilise qui maintient les ressources au minimum. Bien sûr, vous voudrez adapter votre application pour utiliser les ressources dont elle a besoin ...
Référence : http://www.mchange.com/projects/c3p0/index.html
testConnectionOnCheckin
valide la connexion lorsqu'elle est retournée au pool. testConnectionOnCheckOut
, bien que garantissant des connexions actives avant utilisation, serait trop coûteux à faire.idleConnectionTestPeriod
fixe une limite à la durée pendant laquelle une connexion restera inactive avant de la tester. Sans PreferredTestQuery, la valeur par défaut est DatabaseMetaData.getTables()
- qui est indépendante de la base de données, et bien qu'un appel relativement coûteux, soit probablement très bien pour une base de données relativement petite. Si vous êtes paranoïaque à propos des performances, utilisez une requête spécifique à votre base de données (c'est-à-dire preferredTestQuery="SELECT 1"
)maxIdleTimeExcessConnections
ramènera le connectionCount à minPoolSize
après un pic d'activité.Les ensembles de configuration ci-dessous ont une taille de pool comprise entre 3 et 20. Les connexions inactives sont testées à nouveau toutes les 5 minutes pour les maintenir actives. En raison de idleConnectionTestPeriod
, cela ne maintiendra que le nombre minimum de connexions. S'il y a plus de 3 connexions au bout de 4 minutes, il tue ces connexions libérant les ressources au minimum.
L'utilisation de maxIdleTimeExcessConnections
et idleConnectionTestPeriod
annule le besoin 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>
La meilleure configuration consiste à configurer JPA pour utiliser l'environnement de conteneur pour obtenir DataSource.
Cela permet au conteneur de fournir le pool de connexions plutôt que de le configurer directement dans votre projet JPA.
Vous n'indiquez pas l'environnement de conteneur avec lequel vous travaillez. J'utilise presque toujours c3p0 avec des applications autonomes, telles que Java SE applications de bureau ou de serveur. Je l'utilise également avec le framework Spring.
Lorsque vous utilisez un conteneur tel que Servlet (Tomcat/Jetty) ou Application Server (tel que Glashfish ou JBoss AS), ceux-ci fournissent déjà une implémentation du pool de connexions DataSource qui n'est généralement pas c3p0 mais fournit une fonction équivalente.
Je n'ai jamais essayé de configurer un pool de connexions dans un projet JPA, car cela signifie modifier la configuration pour la personnaliser pour chaque environnement dans lequel il doit s'exécuter. C'est un casse-tête, il est donc préférable que la partie JPA reçoive la DataSource à utiliser lors de l'amorçage.