12

我想知道我的 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();
        }
      }
    }
4

4 回答 4

10

你必须用你的实际框架测试你将使用多少最小和最大连接池。根据这篇文章

小连接池:

将对连接表进行更快的访问。但可能没有足够的连接来满足请求,并且请求可能会在队列中花费更多时间。

大型连接池:

将有更多的连接来完成请求,请求将在队列中花费更少(或没有)时间,代价是连接表上的访问速度较慢。

所以你必须用一些连接池进行测试,做一些负载测试。还可以考虑获取有关当前负载的性能/资源使用信息,并进行一些基于事务成本的分析。

并且根据分析结果,如果访问连接表的速度太慢,那么可以减少连接池,或者如果连接不够,可以增加更多的连接池。平衡这些因素以获得最佳时间间隔。

于 2013-07-24T10:41:21.903 回答
2

如果您正在使用一些应用程序服务器(Jboss、Weblogic、Glassfish 等),这个人可以向您展示一些关于您的池使用情况的统计数据。分析其中一些数据(最长排队时间、使用中的最大连接数等)并运行一些测试以找出最适合您的情况的数字。

于 2013-07-30T17:19:15.343 回答
0

您必须使用第三方连接池,如 c3p0。100 个并发用户需要 20 到 30 个连接。您必须使用一些工具(如 jmeter)进行性能测试。使用性能工具,您可以发送 n 个并发请求。根据该报告,您可以增加或减少连接大小。

于 2013-07-31T07:17:02.310 回答
0

了解您需要多少连接的唯一合理方法是进行监控和调整。这是因为连接获取时间、池大小和传入请求吞吐量之间的关系是由Little's Law给出的,因此池大小取决于即将到来的请求数量以及在获得连接之前您愿意等待多长时间。

FlexyPool是一个开源框架,允许您监控连接使用情况,它甚至可以将池大小增加到超过初始容量。

FlexyPool 收集以下指标

  • 并发连接直方图
  • 并发连接请求直方图
  • 数据源连接获取时间直方图
  • 连接租用时间直方图
  • 最大池大小直方图
  • 总连接获取时间直方图
  • 溢出池大小直方图
  • 重试尝试直方图

它支持几乎所有主要的连接池解决方案:

  • Apache DBCP
  • 阿帕奇 DBCP2
  • C3P0
  • 骨CP
  • 光CP
  • 雄猫CP
  • 维布尔 DBCP
  • Bitronix 事务管理器
  • Atomikos 交易要点
  • Java EE 数据源

它使用 Codahale/Dropwizard Metrics,因此您可以将其与 Graphana 或 Graphite 集成。

所以,回到你的问题。您可以从较小的池大小(5 个连接)开始,并配置 5 个额外连接的溢出缓冲区。您可以根据您的应用程序 SLA(100 毫秒)设置超时间隔。然后,您可以按照本文中的说明监控连接池的使用情况。

于 2016-08-10T06:41:31.893 回答