Pratiques de pooling de connexion MySQL JDBC pour éviter l'épuisement du pool de connexions
J'ai un Java JSF Application Web sur GlassFish, dans laquelle je veux utiliser le regroupement de connexion. Donc j'ai créé un application
étendue de haricot qui sert à Connection
cas pour d'autres haricots:
public class DatabaseBean {
private DataSource myDataSource;
public DatabaseBean() {
try {
Context ctx = new InitialContext();
ecwinsDataSource = (DataSource) ctx.lookup("jdbc/myDataSource");
} catch (NamingException ex) {
ex.printStackTrace();
}
}
public Connection getConnection() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
Connection connection = myDataSource.getConnection();
System.out.println("Succesfully connected: " + connection);
//Sample: Succesfully connected: com.sun.gjc.spi.jdbc40.ConnectionHolder40@7fb213a5
return connection;
}
}
De cette façon, la connexion de la piscine se remplit très vite, après un peu de navigation par le biais de 'db liées points de vue, l'application s'arrête avec les éléments suivants:
RAR5117 : impossible d'obtenir/créer une connexion à partir d'un pool de connexion [ mysql_testPool ]. Raison :-utiliser des connexions égalité max-pool-size et expiré max-les temps d'attente. Ne peut pas allouer plus de connexions. RAR5114 : Erreur d'allocation de connexion : [Erreur dans l'attribution d'une connexion. Cause:-utiliser des connexions égalité max-pool-size et expiré max-les temps d'attente. Ne peut pas allouer plus de connexions.] java.sql.SQLException: Erreur dans l'attribution d'une connexion. Cause:-utiliser des connexions égalité max-pool-size et expiré max-les temps d'attente. Ne peut pas allouer plus de connexions.
Je suis à la fermeture des connexions et d'autres ressources dans chaque méthode. L'application s'exécute tous OK avec autonome connexions.
Ce que je fais mal? Des conseils ou des conseils seraient appréciés.
source d'informationauteur Daniel Szalay
Vous devez vous connecter pour publier un commentaire.
L'exception indique un cas typique de code de l'application qui les fuites de connexions de base de données. Vous devez vous assurer que vous acquérir et près tous d'entre eux (
Connection
Statement
etResultSet
) dans untry-with-resources
bloc dans la même méthode de bloc selon la normale JDBC idiome.Ou lorsque vous n'êtes pas sur de Java 7, dans un
try-finally
bloc. Fermeture dansfinally
permettra de garantir qu'ils sont également en cas de fermeture des exceptions.Oui, vous avez encore besoin de fermer les connexions de vous, même lorsque vous utilisez le regroupement de connexion. C'est une erreur commune parmi les partants de ce qu'ils pensent qu'il va ensuite gérer automatiquement le fermer. C'est pas vrai. Le pool de connexion à savoir retourne un enveloppé de connexion qui fait quelque chose comme ce qui suit dans le close():
Ne pas les fermer serait la cause de la connexion n'est pas libéré de retour à la piscine pour la réutilisation et donc il va en acquérir une nouvelle, encore et encore jusqu'à ce que la DB est à court de connexions qui sera la cause de votre application crash.
Voir aussi:
Si vous avez besoin de la connexion JDBC mise en commun, pourquoi ne pas s'appuyer sur ce qui est d'ores et déjà disponibles? Autant que je sache, connexion JDBC à la mise en commun est considérée comme plus ou moins une fonctionnalité standard de ces serveurs d'applications java, et de l'OMI, vous ne devriez pas vous voulez construire vous-même si vous êtes simplement intéressé à la création d'une application.
Voici un lien qui devrait vous aider à démarrer:
http://weblogs.java.net/blog/2007/09/12/totd-9-using-jdbc-connection-pooljndi-name-glassfish-rails-application
Ce que vous devriez probablement être en train de faire est de savoir comment permettre à votre application de saisir une connexion à partir de la piscine en utilisant jndi.