仮死Tomcatの接続プールの枯渇のプロセスのトラブルシューティングにRabbitMQのキューの処理結果

背景:
ビジネスデータ処理の実行のためのリスナーRabbitMQのキュー
システムのパフォーマンスの問題を:
サービスシステムが正常に動作しないことができ、すべての要求は、適切な報告されない異常な404
コンソールのパフォーマンスの問題:
データロガーを受信すると、印刷キューを記録しますが、(関連するSQLを印刷しませんSQLの印刷前に)
:例外与えられている
)を開始(DBCP接続プールを

[WARN ] 19:01:05.762 [SimpleAsyncTaskExecutor-1] o.h.util.JDBCExceptionReporter - SQL Error: 1040, SQLState: 08004
[ERROR] 19:01:05.762 [SimpleAsyncTaskExecutor-1] o.h.util.JDBCExceptionReporter - Data source rejected establishment of connection,  message from server: "Too many connections"
Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
Caused by: org.hibernate.exception.JDBCConnectionException: Cannot open connection
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"

(後で変更を使用して、後続の試験分析はドルイド、接続プールの後に得られた監視の便宜のために、)ドルイド接続プール

[WARN ] 17:35:23.659 [SimpleAsyncTaskExecutor-1] o.h.util.JDBCExceptionReporter - SQL Error: 0, SQLState: null
[ERROR] 17:35:23.659 [SimpleAsyncTaskExecutor-1] o.h.util.JDBCExceptionReporter - wait millis 10000, active 152, maxActive 500, creating 0
[ERROR] 17:35:31.106 [QuartzScheduler_scheduler-LAPTOP-B40EFQQR1565686921066_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore - ClusterManager: Error managing cluster: Failed to obtain DB connection from data source 'springNonTxDataSource.scheduler': com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 152, maxActive 500, creating 0
org.quartz.JobPersistenceException: Failed to obtain DB connection from data source 'springNonTxDataSource.scheduler': com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 152, maxActive 500, creating 0
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 152, maxActive 500, creating 0
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
[WARN ] 17:35:43.742 [SimpleAsyncTaskExecutor-1] o.s.a.r.l.SimpleMessageListenerContainer - Execution of Rabbit message listener failed, and no ErrorHandler has been set.
org.springframework.amqp.rabbit.listener.ListenerExecutionFailedException: Listener threw exception
Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 152, maxActive 500, creating 0

リスナーのコアコード:

protected void doBusiness(String msg, String queueName) {
    List<WeldingDto> list;
    list = new LinkedList<>();
    //校验数据合法性
    super.validatePattern(msg, list, WeldingDto.class);
    if (!list.isEmpty()) {
        //保存wip表相关信息
        WeldingDto weldingDto = list.get(0);
        EquipDto equipDto = this.wipTempService.getEquipDto(weldingDto.getEquipCode(), null);
        List<WorkOrder> workingOrderList = this.workOrderDao.getWorkingOrderListByEquip(equipDto.getId());
        //注释部分业务代码,不影响问题分析
    }
}

問題分析:
オープンの論理接続数>説明論理接続をクローズ:接続リーク
プール内の接続の数をもたらすは、プール内の接続の数が0になると、排出され、
確証試験は、問題を発見した:
キューがクリアされ、それぞれがデータを失われ、接続されたリークの+ N個
トラブルシューティング・プログラム:
次のようにタイムアウト回復機構ドルイド接続プールの構成を使用してです。

<!-- 超过时间限制是否回收 -->  
<property name="removeAbandoned" value="true" />  
<!-- 超时时间,单位为秒 -->  
<property name="removeAbandonedTimeout" value="20" />  
<!-- 关闭abanded连接时输出错误日志 -->  
<property name="logAbandoned" value="true" />

上記の構成を追加した後、「データソースのデータソース」ドルイドの「ビューのアクティブな接続がのActiveConnectionスタックトレーススタック」監視
鋸例外ログを、ログが閉鎖位置異常は、接続コードによって占有されていないことがわかります。
注:この設定は、システムのパフォーマンスに影響を与え、未解決の問題のトラブルシューティングを行うシステムが稼働している閉鎖することをお勧めします。

次のように異常なログは次のとおりです。

java.lang.Thread.getStackTrace(Thread.java:1559)
com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1209)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1135)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1125)
com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:104)
org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:83)
org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1616)
org.hibernate.loader.Loader.doQuery(Loader.java:717)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
org.hibernate.loader.Loader.doList(Loader.java:2449)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)
org.hibernate.loader.Loader.list(Loader.java:2187)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
com.wisdytech.linkmes.plan.dao.impl.WorkOrderDaoImpl.getWorkingOrderListByEquip(WorkOrderDaoImpl.java:331)
com.wisdytech.linkmes.msghandler.listeners.business.WeldingQueueListener.doBusiness(WeldingQueueListener.java:109)
com.wisdytech.linkmes.msghandler.listeners.CommonQueueListener.onMessage(CommonQueueListener.java:70)
org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:334)
org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:546)
org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:472)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:61)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:111)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:627)
org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:454)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:480)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:464)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$300(SimpleMessageListenerContainer.java:61)
org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:558)
java.lang.Thread.run(Thread.java:748)

あなたは、問題の場所を指定するコードを見つけたら、作成後に閉じてセッションを作成しません()のコードはのgetSessionを発見した分析。
解決方法1:手動で閉じます

Session session = this.getSession();
org.hibernate.Query query = session.createQuery(hql.toString());
List<XXX> list = query.list();
session.close();

解決策2:使用のコールバックメカニズム、スプリングによって閉じ

this.getHibernateTemplate().executeFind(new HibernateCallback<Object>() {
    @Override
    public Object doInHibernate(Session session) throws HibernateException {
        org.hibernate.Query query = session.createQuery(hql.toString());//输入参数类型final
        List<XXX> list1 = query.list();
        return list1;
    }
});

//コールバックは、次の二つの方法が付属しています

this.getHibernateTemplate().find(hql.toString());
this.getHibernateTemplate().get(XXX.class,"id");
getSession() ノー 手動でシャットダウンする必要があります
getHibernateTemplate() 春のパッケージには、適切な宣言的トランザクション管理を追加した後、 春の管理

注意:getHibernateTemplateを(使用することをお勧めします)、getHibernateTemplate(メソッドが提供されていない)のために、あなたはコールバックメソッドHibernateCallback管理データベース、上記のコードを使用することができます。
解決策3:トランザクションを追加します
。この問題は、DAO層のリスナー方法、参加していないDAOトランザクション層と呼ばれ、最も外側のシース層は、リスナーやDAOレイヤーを追加するトランザクションのトランザクションサービスのメソッドを持つことができます。

おすすめ

転載: www.cnblogs.com/chonghaojie/p/11348109.html