1

休止状態フレームワークを使用してエンタープライズ アプリケーションを開発しました。ユーザー数が急増すると (ユーザー数が 200 を超えると) アプリケーションがハングします。次の方法を試しましたが、問題は解決しません。

1) C3PO 接続プーリング (以前は接続プーリングは使用されていません)

2) 休止状態の接続プール サイズを 300 に増やしました (値 100 より前)。

3) getCurrentSession メソッドを openSession に変更

hibernate.cfg.xml ファイルには connection.pool_size=300があります

ほとんどのアプリケーション クエリは、このメソッドを使用して呼び出されます -

@オーバーライド

public List getLovServiceSqlParam(String query, Object[] obj) {

    // TODO Auto-generated method stub
    Session session = null;
    if (this.getHibernateTemplate() != null && query != null
            && query.length() > 0) {

        try
        {
            session = this.getHibernateTemplate().getSessionFactory().openSession();
            SQLQuery query1 = session.createSQLQuery(query);

            for(int i=0;i<obj.length;i++)
            {
                query1.setParameter(i, obj[i]);
            }
            result = query1.list();
            session.close();
        }
        catch (DataAccessException e) {
            e.printStackTrace();
            throw e;
        }

        finally
        {
            if (session != null && session.isOpen()) {
                session.close();
            }
        }

    }

    return result;
}
4

1 に答える 1

0

この種の状況は、コードを見て解決するのではなく、CPU サンプリング ツール (jvisualvm など、無料で oracle JVM パッケージに含まれています。こちらを参照してください:)$JAVA_HOME/bin/jvisualvmをアプリケーションの負荷の下で実行することによって解決されます。

UI スレッドが最も多くの時間を費やしている場所を調べ、これらの部分を次々と最適化します。

データベースへの接続が失われたか、一部のクエリでの競合が原因である可能性があり、まったく予期しない何かが原因である可能性があります。CPU サンプリング分析を実行して初めてわかります。

これをする、

  • 負荷がかかっているアプリケーションに jvisualvm を接続します (実稼働環境と同じ動作を示す環境を取得するのは簡単ではないかもしれませんが、作業している IT ルールによっては、実稼働環境への jvisualvm アクセスを取得するのがさらに難しくなる可能性があります) 、
  • Samplerタブに切り替えて、 ボタンをクリックしCPU
  • UI でアクションをトリガーします (通常、このアクションは予期しない動作をするはずです (遅すぎますか?))。
  • 完了したら、Snapshotボタンをクリックします。
  • そこから UI スレッドを見つけ (簡単ではないかもしれません)、それが最も多くの時間を費やしている場所を探します。
  • この部分を最適化
于 2017-01-12T13:59:58.083 に答える