Пул соединений с JDBC все еще улучшает производительность в настоящее время? - PullRequest
4 голосов
/ 01 июля 2011

Мое приложение не использует какую-либо форму пула соединений, я работаю напрямую с соединениями. Приложение выполняет в основном короткие, простые запросы. Из журнала видно, что он часто открывает и закрывает соединения, часто выполняя только один выбор из одной или нескольких строк между ними. Обычно это занимает ~ 100 мс (включая открытие и закрытие соединения).

Существует бесчисленное множество статей и записей в блогах о том, как объединение в пул соединений повышает производительность приложений, но все они выглядят довольно старыми (5 и более лет).

Обеспечивает ли пул соединений достаточное повышение производительности или устарел. Я использую SQLServer 2008 с драйвером Microsoft JSBC версии 3.0, если это имеет значение.


Результаты / Обновление: с тех пор, как я задал этот вопрос, произошло много вещей (мы переключаем драйвер JDBC и много других вещей). Некоторое время я делал много рефакторингов и прочего, и в это время я также добавил пул соединений в это приложение. При использовании пула соединений некоторые запросы теперь выполняются быстрее, чем можно измерить гранулярность метки времени журнала (я полагаю, менее 16 мс).

Итак, в заключение, да, пул соединений все еще стоит усилий, если вам нужно часто подключаться / отключаться.

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

Если для каждого запроса 100 мс, то вам не нужен пул соединений.Если вам нужны запросы продолжительностью менее 20 мс, повторное использование соединений необходимо.

Если ваш драйвер поддерживает собственный пул соединений, я предлагаю вам использовать это (в случае, если он уже не делает этого для вас).Только если вам нужен больший контроль над тем, как соединения объединяются, вы можете использовать дополнительную библиотеку (я никогда ее не использовал)

Примечание: вам не нужно использовать пул для повторного использования соединений.

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

Если вы хотитечтобы иметь возможность выполнять запросы одновременно и иметь только несколько потоков, которые будут выполнять запросы, вы можете сохранить соединение в поле ThreadLocal.

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

Для модели ThreadLocal вы можете сделать

public static final ThreadLocal<Connection> CONNECTION = new ThreadLocal<Connection>() {
     public Connection initialValue() {
         LOG.info(Thread.currentThread()+": created a connection.");
         return createConnection();
     }
};

Если вы хотите контролировать, как очищаются соединения.

private static final Map<Thread, Connection> connections = new ConcurrentHashMap();
public static final ThreadLocal<Connection> CONNECTION = new ThreadLocal<Connection>() {
     public Connection initialValue() {
         LOG.info(Thread.currentThread()+": created a connection.");
         Connection conn = createConnection();
         connections.put(Thread.currentThread(), conn);
         return conn;
     }
};
public static void cleanUp() {
     for(Map.Entry<Thread, Connection> entry: connections.entrySet()) {
         Thread t = entry.getKey();
         if (!t.isAlive()) {
             LOG.info(t+": closed a connection.");
             connections.remove(t);
             entry.getValue().close();
         }
     }
}

Если вас беспокоит получение разорванного соединения, вы можете переопределить get () ThreadLocal для проверки соединения перед возвратом.

4 голосов
/ 01 июля 2011

Это зависит в некоторой степени от программного обеспечения базы данных.Некоторые (например, MySQL) имеют относительно легкие соединения, которые быстро открываются.Другие, как Oracle, имеют соединения, которые являются большими сигнальными структурами с серьезными накладными расходами.

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

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

...