Как найти разумный размер для пула соединений с базой данных и как его проверить?

Мне интересно, что будет разумным номером для моего connection.pool_size? к каким аспектам это относится? Также необходимо знать, как тестировать приложение, как только размер определен для него.

Мое приложение будет использоваться пользователями AT LEAST 100 одновременно, оно имеет более 20 таблиц в своей базе данных. Моя база данных - это MySQL, а системы AT LEAST 12 используют мое приложение одновременно. Пожалуйста, дайте мне знать, если вам нужно знать больше.

Я также нашел следующее, которое помогает определить размер пула соединений, но все еще не уверен, что такое разумное число.

    Hibernate 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 
    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

вы должны протестировать его с фактической структурой, сколько минимального и максимального пула подключений вы будете использовать. согласно в этой статье:

Малый пул соединений:

Будет иметь более быстрый доступ к таблице соединений. Но может не иметь достаточного количества соединений для удовлетворения запросов и запросов может тратить больше времени в очереди.

Большой пул соединений:

Будет больше соединений для выполнения запросов и запросы будут тратить меньше (или нет) времени в очереди за счет более медленный доступ к таблице соединений.

поэтому вы должны протестировать с помощью некоторого пула соединений, выполните некоторые нагрузочные тесты. Также рассмотрите возможность получения информации об использовании производительности/ресурса для текущей нагрузки и проведения анализа транзакций на основе транзакций.

И по результатам анализа, если доступ к таблице соединений слишком медленный, вы можете уменьшить пул подключений или если соединение недостаточно, вы можете добавить еще пул подключений. Сбалансируйте этот коэффициент, чтобы получить оптимальный промежуток времени.

Ответ 2

Если вы используете какой-либо сервер приложений (Jboss, Weblogic, Glassfish и т.д.), этот парень может показать вам статистику вашего использования в пуле. Проанализируйте некоторые из этих данных (максимальное время очереди, максимальное количество подключений и т.д.) И запустите несколько тестов, чтобы найти, какие числа подходят вашему делу лучше всего.

Ответ 3

Вы должны использовать сторонний пул соединений, например c3p0. От 20 до 30 соединений требуется для 100 concurrecnt пользователей. Вы должны выполнить тестирование производительности с помощью некоторого инструмента (например, jmeter). Используя инструмент "Выполнить", вы можете отправить n количество запросов concurrecnt. на основе этого отчета вы можете увеличить или уменьшить размер соединений.

Ответ 4

Единственный разумный способ узнать, сколько соединений вам нужно - это осуществлять мониторинг и корректировки. Это связано с тем, что связь между временем получения соединения, размером пула и пропускной способностью входящего запроса определяется Little Law, поэтому размер пула зависит на сколько запросов и сколько времени вы готовы ждать до получения соединения.

FlexyPool - это среда с открытым исходным кодом, которая позволяет отслеживать использование соединений и даже увеличивать размер пула за пределы начальной емкости.

FlexyPool собирает следующие показатели:

  • гистограмма параллельных соединений
  • гистограмма запросов параллельного соединения
  • гистограмма времени подключения источника данных
  • гистограмма времени аренды аренды
  • максимальная гистограмма размера пула
  • общая гистограмма времени приема соединения
  • гистограмма размера пула переполнения
  • гистограмма попыток попыток

Он поддерживает практически все основные способы объединения пулов:

  • DBCP Apache
  • Apache DBCP2
  • C3P0
  • BoneCP
  • HikariCP
  • Tomcat CP
  • Vibur DBCP
  • Диспетчер транзакций Bitronix
  • Atomicos TransactionsEssentials
  • Источники данных Java EE

Он использует Codahale/Dropwizard Metrics, чтобы вы могли интегрировать его с Graphana или Graphite.

Итак, вернемся к вашему вопросу. Вы можете начать с небольшого размера пула (5 соединений) и настроить буфер переполнения из 5 дополнительных подключений. Вы можете настроить интервал ожидания в соответствии с вашим SLA приложения (100 мс). Затем вы можете контролировать использование пула соединений как описано в этой статье.