2015-12-20 1 views
2

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.

+0

Vous pouvez ajouter une connexion dans votre configuration. Cela devrait supprimer le problème. –

+0

@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 ... –

+1

'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 –

Répondre

4

J'utilise avec succès un resources.xml dans mon dossier WEB-INF semblable à celui-ci dans mes projets de production:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<Resource id="mysql-jdbc-jta-resource-stg" type="javax.sql.DataSource"> 
    JtaManaged = true 
    DataSourceCreator = tomcat 

    validationQuery = SELECT 1 
    initialSize = 2 
    removeAbandoned = true 
    removeAbandonedTimeout = 120 

    driverClassName = com.mysql.jdbc.Driver 
    url = jdbc:mysql://db-stg.bar.someRegion.rds.amazonaws.com/someDBname 
    username = your-username 
    password = your-pw 
</Resource> 
</resources> 

Une différence importante est d'utiliser DataSourceCreator = tomcat. Cela garantit que TomEE crée un pool qui prend en charge la validation de la connexion ("SELECT 1") et supprime les connexions bloquées/périmées, libérant ainsi des ressources en arrière-plan.

En revanche, la DataSourceCreator = dbpc (qui est par défaut lorsque pas défini: "par défaut fourni piscines sont DBCP ...") se comportait comme vous l'avez décrit/expérimenté (délais d'attente, ...).Vérifiez le related documentation pour plus de différences.

Notez également que = est utilisé dans ma configuration de travail. J'ai découvert que dans les versions précédentes de TomEE, il semblait fonctionner sans =. Cependant, je recommande de configurer avec = systématiquement lorsque votre serveur d'application cible est TomEE 1.7.2 ou supérieur.

De plus amples détails à ce sujet peuvent également être trouvés dans la page DataSource Configuration.

Espérons que ça aide.

+0

Votre réponse a résolu mon problème, merci !! –

+0

Accepté (votre proposition de changement de titre aussi), mais il se peut que j'ai besoin de quelques points de réputation supplémentaires pour que des votes upvotes soient commis. BTW, mon problème n ° 2, qui est moins important ne semble pas changer. Je pense que la création de 2 connexions initiales ou plus, signifie que ces connexions devraient toutes être utilisées au hasard, mais ai-je tort? –

+0

Vous devriez être en mesure d'upvote des réponses à une question que vous avez posté avec 15 réputation. Appuyez sur "flèche vers le haut" à gauche où vous avez trouvé "accepter la réponse"? - votre deuxième problème peut avoir différentes raisons (c'est-à-dire, les paramètres mysql). Peut-être aller pour une autre question qui se concentre uniquement sur cet aspect. Je vais essayer d'aider à nouveau. – MWiesner