2016-12-13 13 views
0

JPA EclipseLInk 2.5.2を使用するアプリケーションを使用しているため、毎分、mysqlが処理を行います。最初にやるべきことは、それがDBに生きていると言うことです。これを行うには、毎分busionessオブジェクトを実行するScheuledExecutorServiceを使用します。このオブジェクトは毎回DAOを閉じます。JPA - CommunicationsException:2番目の接続で通信リンクが失敗しました

私の開発環境(私のコンピュータ)では、デフォルトでWamp64ビットとmysqlが設定されていますが、すべて正常です。プリプロードサーバ(CentOS 7、mysql Ver 14.14 Distrib 5.7.16)を使用すると、最初のループはOKですが、DAOを使用してSQLクエリを実行しようとすると次のエラーがこのメッセージで失敗します:

[EL Warning]: 2016-12-13 09:35:01.936--UnitOfWork(1778154389)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure 

The last packet successfully received from the server was 57 316 milliseconds ago. The last packet sent successfully to the server was 4 milliseconds ago. 
Error Code: 0 
Call: SELECT id, lastDateAliveChargement, lastDateAliveDechargement FROM LastAlive 
Query: ReportQuery(referenceClass=LastAlive sql="SELECT id, lastDateAliveChargement, lastDateAliveDechargement FROM LastAlive") 

preprodでは、まずmariaDB jdbcドライバで使用されるmariaDBを使用しました。それから、mysql jdbc driverでmysqlに切り替えましたが、まだ問題があります。 mysql上で保留中の接続をリストすると、wait30timeoutが期限切れになるまで、のSleepコマンド(Sleep)が表示されます。 私は(my.cnfの)これらの設定を使用してMySQLを設定するには(WindowsのようにWAMP、)私のコンピュータ上で

[mysqld] 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 

log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
max_connections=100 
port=3306 
wait_timeout=3600 

を試してみました: [mysqlの] 無自動焼き直し//これは、上のPARAMで起動に失敗ここ= 3306

サーバ [mysqldを] ポートは、JPAの初期化paramsは次のとおり

persistenceMapInitiales.put("javax.persistence.jdbc.driver","com.mysql.cj.jdbc.Driver");    
persistenceMapInitiales.put("javax.persistence.jdbc.url","jdbc:mysql://MY_REMOTE_IP/myDB?characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=UTC&autoReconnect=true&useSSL=false"); 
persistenceMapInitiales.put("javax.persistence.jdbc.user","toto"); 
persistenceMapInitiales.put("javax.persistence.jdbc.password","toto"); 
persistenceMapInitiales.put("eclipselink.ddl-generation","create-or-extend-tables"); 
persistenceMapInitiales.put("eclipselink.create-ddl-jdbc-file-name","createDDL_ddlGeneration.jdbc"); 
persistenceMapInitiales.put("eclipselink.drop-ddl-jdbc-file-name","dropDDL_ddlGeneration.jdbc"); 
persistenceMapInitiales.put("eclipselink.ddl.default-table-suffix","engine=InnoDB"); 
persistenceMapInitiales.put("eclipselink.ddl-generation.output-mode","both"); 

persistenceMapInitiales.put("eclipselink.connection-pool.default.initial","1"); 
persistenceMapInitiales.put("eclipselink.connection-pool.default.min","64"); 
persistenceMapInitiales.put("eclipselink.connection-pool.default.max","64"); 

scheduledExectorServiceの宣言:

public static void main(String[] args) 
{ 
    final Integer CRON_PERIOD = 1; // every minute 
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
    scheduler.scheduleAtFixedRate(new MyWork(), 0, CRON_PERIOD, TimeUnit.MINUTES); 
} 

ビジネスクラス

public class MyWork() implements Runnable{ 

    private LastAliveDao lastAliveDao; 
    //... 

    public void run() 
    { 
     sayIsAlive(); 
     //... 
    } 

    private void sayIsAlive() 
    { 
     logger.info("upadet isAlive"); 
     try{ 
      lastAliveDao = new JpaLastAliveDao(); 
      lastAliveDao.sayChargementIsAlive(); 
     }catch(Exception e){ 
      logger.error("", e); 
     }finally{ 
      try{ 
       lastAliveDao.close(); 
      }catch(Exception e) 
      { 
       logger.warn("Exception closing dao : ", e); 
      } 
      lastAliveDao = null; 
     } 
    } 
} 

DAOコード:

public class JpaLastAliveDao extends JpaDao<LastAlive, Integer> implements LastAliveDao { 

@Override 
public void sayChargementIsAlive() { 
    List<LastAlive> alives = this.list(); 
    if(alives.size() == 0){ 
     LastAlive alive = new LastAlive(); 
     alive.setLastDateAliveChargement(Calendar.getInstance().getTime()); 
     this.persist(alive); 
    }else{ 
     LastAlive alive = alives.get(0); 
     alive.setLastDateAliveChargement(Calendar.getInstance().getTime()); 
     this.update(alive); 
    } 
} 

そしてJpaDAOコード:私は理由を見つけた

public abstract class JpaDao<T, PK extends Serializable> 
    implements Dao<T, PK>{ 

    protected Class<T> entityClass; 

    protected EntityManagerFactory emf; 
    protected EntityManager em; 

    @SuppressWarnings("unchecked") 
    public JpaDao() 
    { 
     emf = JPAUtils.getInstance("facturator").getEmf(); 
     em = emf.createEntityManager(); 
     ParameterizedType genericSuperclass = (ParameterizedType) 
       getClass().getGenericSuperclass(); 
     this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0]; 
    } 

    public T persist(T t) { 
     this.em.getTransaction().begin(); 
     this.em.persist(t); 
     this.em.getTransaction().commit(); 
     return t; 
    } 

    public T findById(PK id) { 
     return this.em.find(entityClass, id); 
    } 

    public T update(T t) { 
     this.em.getTransaction().begin(); 
     T entityPersist = this.em.merge(t); 
     this.em.getTransaction().commit(); 
     return entityPersist; 
    } 

    @SuppressWarnings("unchecked") 
    public List<T> list() 
    { 
     return this.em.createQuery("SELECT t FROM "+entityClass.getName()+" t ").getResultList(); 
    } 

    public void delete(T t) { 
     this.em.getTransaction().begin(); 
     this.em.remove(t); 
     this.em.getTransaction().commit(); 
    } 

    public void close(){ 
     em.close(); 
    } 

} 

答えて

0

OK。 DBサーバーとプログラムサーバーは、2つの異なるサブマスクネットワーク上に構成されました.1つは255.255.255.0、もう1つは255.255.255.255です。

最初のログ設定でスタックに表示されなかったSocketExceptionが見つかりました。

関連する問題