2013-07-22 21 views
11

私のconnection.pool_sizeには何が妥当な数字になるのだろうか?それはどのような側面に関連していますか?また、サイズが定義されたらアプリケーションをテストする方法も知っておく必要があります。データベース接続プールの妥当なサイズの確認方法と検証方法

私のアプリケーションは、100人以上のユーザーが同時に使用する予定で、データベースに20を超えるテーブルがあります。私のデータベースはMySQLであり、少なくとも12のシステムは私のアプリケーションを同時に使用しています。もっと知る必要がある場合はお知らせください。

また、接続プールのサイズを定義するのに役立ちますが、それでも妥当な数値がわからない場合は、次のものも見つかりました。

Hibernate's own connection pooling algorithm is, however, quite rudimentary. 
    It is intended to help you get started and is not intended for use in a production 
    system, or even for performance testing. You should use a third party pool for 
    best performance and stability. Just replace the hibernate.connection.pool_size 
    property with connection pool specific settings. This will turn off Hibernate's 
    internal pool. For example, you might like to use c3p0. 

    connection.pool_size indicates the maximum number of pooled connections. So it is 
    better to keep it at a logical count. It depends on your application and DB how 
    much it can handle. 10 is a reasonable count that will typically used as it is 
    sufficient for most cases. 

私HibernateUtilのはあなたが使用するどのくらいの最小値と最大接続プール実際のフレームワークでそれをテストする必要があります

import org.hibernate.HibernateException; 
    import org.hibernate.Session; 
    import org.hibernate.SessionFactory; 
    import org.hibernate.cfg.Configuration; 
    import org.hibernate.service.ServiceRegistry; 
    import org.hibernate.service.ServiceRegistryBuilder; 

    public class HibernateUtil { 

     private static ServiceRegistry serviceRegistry; 
     private static final ThreadLocal<Session> threadLocal = new ThreadLocal(); 
     private static SessionFactory sessionFactory; 
     private static SessionFactory configureSessionFactory() { 
      try { 
       Configuration configuration = new Configuration(); 
       configuration.configure(); 
       serviceRegistry = new 
ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 
       sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
       return sessionFactory; 
      } catch (HibernateException e) { 
       System.out.append("** Exception in SessionFactory **"); 
       e.printStackTrace(); 
      } 
      return sessionFactory; 
     } 

     static { 
     try { 
      sessionFactory = configureSessionFactory(); 
     } catch (Exception e) { 
      System.err.println("%%%% Error Creating SessionFactory %%%%"); 
      e.printStackTrace(); 
     } 
     } 

     private HibernateUtil() { 
     } 

     public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
     } 

     public static Session getSession() throws HibernateException { 
     Session session = threadLocal.get(); 

     if (session == null || !session.isOpen()) { 
      if (sessionFactory == null) { 
      rebuildSessionFactory(); 
      } 
      session = (sessionFactory != null) ? sessionFactory.openSession() : null; 
      threadLocal.set(session); 
     } 

     return session; 
     } 

     public static void rebuildSessionFactory() { 
     try { 
      sessionFactory = configureSessionFactory(); 
     } catch (Exception e) { 
      System.err.println("%%%% Error Creating SessionFactory %%%%"); 
      e.printStackTrace(); 
     } 
     } 

     public static void closeSession() throws HibernateException { 
     Session session = (Session) threadLocal.get(); 
     threadLocal.set(null); 

     if (session != null) { 
      session.close(); 
     } 
     } 
    } 
+1

一度に使用しているデータベースの種類とデータベースに接続するシステムの数はいくつですか? – Karthikeyan

+2

@ Karthikeyanの質問が更新され、12のシステムが同時にそれを使用しており、データベースはmysql –

答えて

8

を以下の通りです。 this articleによると:

小接続プール:

が接続テーブルに速くアクセスできるようになります。 しかし、要求と要求を満たすのに十分な接続がない可能性があります。 がキューに時間を費やす可能性があります。

大接続プール:

が要求 を満たすために複数の接続を持つことになりますし、要求が接続テーブルに 遅くアクセスのコストでキューに少ない(または全くない)時間を過ごすことになります。

したがって、いくつかの接続プールでテストする必要があります。負荷テストをしてください。また、現在の負荷に関するパフォーマンス/リソース使用状況の情報を取得し、トランザクション・コスト・ベースの分析を行うことも検討してください。

そして、接続テーブルへのアクセスが遅すぎると接続プールを減らすことができない場合、または接続が十分でない場合は接続プールを追加できます。最適な時間の経過を得るためにこれらの要素をバランスさせます。

+0

上記のように現実的なものは何でしょうか? – maxammann

2

アプリケーションサーバー(Jboss、Weblogic、Glassfishな​​ど)を使用している場合、このユーザーはプールの使用状況に関する統計情報を表示できます。このデータの一部(最大キュー時間、使用中の最大接続数など)を分析し、いくつかのテストを実行して、あなたのケースに最も適した数字を見つける。

0

c3p0のようなサードパーティの接続プールを使用する必要があります。 100人の同時利用者には20〜30回の要請が必要です。あなたはいくつかのツール(jmeterのような)を使ってパフォーマンステストをしなければなりません。 perfomanceツールを使用すると、n個の同時リクエストを送信できます。そのレポートに基づいて、接続サイズを増減させることができます。

0

必要な接続数を知る唯一の合理的な方法は、監視と調整を行うことです。これは、接続獲得時間、プールサイズ、および着信要求スループットの関係がLittle's Lawで与えられているためです。したがって、プールサイズは、要求の数と接続を取得するまでにどれくらい待っているかによって異なります。

FlexyPoolはオープ​​ンソースのフレームワークで、接続の使用状況を監視でき、初期容量を超えてプールサイズを増やすことさえできます。

FlexyPool collects the following metrics

  • 同時接続ヒストグラム
  • 同時接続要求
  • 接続リース時間ヒストグラム
  • 最大プールサイズのヒストグラム
  • 総接続時間ヒストグラムを取得
  • データソース接続をヒストグラム時間ヒストグラムを取得する
  • オーバーフロープールサイズのヒストグラム
  • 再試行ヒストグラム

それはほとんどすべての主要な接続プーリング・ソリューションをサポートしています。

  • ApacheのDBCP
  • アパッチDBCP2
  • C3P0
  • BoneCP
  • こんにちはkariCP
  • TomcatのCP
  • Vibur DBCP
  • Bitronixトランザクションマネージャ
  • Atomikos TransactionsEssentials
  • のJava EEデータソース

あなたがGraphanaまたはグラファイトでそれを統合することができますので、それはCodahale/Dropwizardメトリクスを使用しています。

あなたの質問に戻る。小さいプールサイズ(5接続)で開始し、5つの追加接続のオーバーフローバッファを構成できます。アプリケーションのSLA(100ミリ秒)に応じてタイムアウト間隔を設定できます。次に、接続プールの使用状況を監視することができますas explained in this article

関連する問題