Je crée une application Web JSF sur TomE1.7.2 (sur tomcat7, javaEE6). J'ai JDBC au paramètre de connexion mysql5.6.23 qui ressemblent à ci-dessous, et cela fonctionne juste bien, pour seulement quelques heures.Comment éviter les connexions DB bloquées avec le pool de connexions JDBC de TomEE?
Mon accès aux données super classe:
public class BaseDao {
@javax.ejb.EJB
MyEnvironmentService env;
@javax.persistence.PersistenceContext(unitName = "persistence-unit-stg")
protected javax.persistence.EntityManager em_stg;
@javax.persistence.PersistenceContext(unitName = "persistence-unit-prd")
protected javax.persistence.EntityManager em_prd;
protected javax.persistence.EntityManager em;
@javax.annotation.PostConstruct
private void init(){
switch (env.getName()){
case "stg":
em = em_stg;
break;
case "prd":
em = em_prd;
break;
default:
throw new RuntimeException("Oh no!");
}
}
}
Ma classe d'accès aux données:
@javax.ejb.Stateless
public class MyDao extends BaseDao{
public MyEntity find(Object id) {
return em.find(MyEntity.class, id);
}
}
Mon META-INF/persistence.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistence-unit-stg" transaction-type="JTA">
<jta-data-source>mysql-jdbc-jta-resource-stg</jta-data-source>
</persistence-unit>
<!-- almost same persistence-unit for prd -->
</persistence>
Mon WEB-INF/resource.xml:
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<Resource id="mysql-jdbc-jta-resource-stg" type="javax.sql.DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://db-stg.bar.someRegion.rds.amazonaws.com/someDBname
UserName username
password password
jtaManaged true
</Resource>
<!-- almost same Resource for prd -->
</resources>
J'ai 2 problèmes que je veux résoudre:
1. Quand je commence mon application web sur l'environnement mise en scène, laissez-le, et mysql "wait_timeout" vient, mon application Web obtient
javax.transaction.RollbackException: Transaction is marked for rollback
et ne peut pas se reconnecter à mysql pour toujours. J'ai déjà essayé certains autoreconnect = true ou autoreconnectForPool = true choses de JDBC, ne fonctionnait pas non plus, et je pense que ce n'est pas la meilleure chose à faire, en premier lieu (fonctionnalité déjà obsolète?).
2. Quand je commence mon application web, je vois exactement 3 connexions connectés à MySQL, et à chaque fois, seulement 1 de la connexion est semble être utilisé et étend son délai d'attente, mais 2 autres ne sont jamais utilisés et tué juste à la "wait_timeout". J'ai essayé "initialSize 10", et il vient avec 15 connexions, et encore, seulement 1 de la connexion est utilisée.
Je crois qu'il ya une solution très simple pour eux, parce qu'il dit:
Internally, from TomEE 1.5.0, JDBC pools are managed via Tomcat-pool.
dans cette page http://tomee.apache.org/common-datasource-configurations.html
Eh bien oui, je veux utiliser ce pool Tomcat JDBC (ou quelque chose alternative est bien.), il ne semble pas être activé. Peut-être qu'il me manque des paramètres de xml ou un pot ou autre, mais je n'en ai aucune idée. aidez-moi s'il vous plaît.
Vous pouvez ajouter une connexion dans votre configuration. Cela devrait supprimer le problème. –
@Norbert Merci, mais je n'ai pas trouvé de paramètres "keep alive", dans la page officielle de TomEE ou dans la page de pool de tomcat jdbc ... –
'validationInterval',' testWhileIdle' et 'validationQuery' sont ce que vous utilisez pour créer un keep alive dans Tomcat. Voir https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html pour plus de détails –