2017-02-11 8 views
1

Я использую C3P0NativeJdbcExtractor для извлечения собственного JDBC-соединения, как показано ниже.Connection.close() на C3P0NativeJdbcExtractor закрывает соединение и удаляет его из пула

public Connection getNativeConnection() throws SQLException{ 
     C3P0NativeJdbcExtractor nativeJbdc; 
     nativeJbdc = new C3P0NativeJdbcExtractor(); 
     return nativeJbdc.getNativeConnection(dataSource.getConnection()); 
    } 

Обратите внимание, что источник данных здесь получен из пула соединений C3P0. Когда я возвращаю этот метод Connection.close(), он фактически закрывает соединение вместо возврата в пул.

Однако, если мы закроем развернутое соединение, оно возвращается в бассейн.

Есть ли причина, почему закрытие завернутого соединения здесь не возвращает соединение с пулом?

+0

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

ответ

2

Пул соединений, например c3p0, содержит набор физических («родных») соединений, созданных драйвером JDBC. Когда вы запрашиваете соединение, он переносит это физическое соединение в прокси-сервер, также называемое логическим соединением.

Этот прокси-сервер перехватит определенные методы, такие как Connection.close(). Для close() вместо закрытия соединения он аннулирует логическое соединение, поэтому он ведет себя как закрытое соединение и возвращает физическое соединение с пулом подключений.

Ваш код извлекает физическое соединение из логического соединения и возвращает это вместо этого, поэтому, если вы вызываете close(), вы фактически закрываете соединение с базой данных, а не возвращаете его в пул.

У вас почти никогда не будет причины извлекать родное соединение, подобное этому. Единственная причина - когда вам нужен доступ к конкретным функциям драйвера. Вы должны стараться использовать стандартный JDBC как можно больше и только отказываться от доступа к особенностям, зависящим от драйвера, когда вам действительно нужно.

Когда вы вызываете close(), обязательно вызывайте close() в логическое соединение, которое вы получили из пула соединений, а не на развернутом физическом соединении.

+0

Это то, что я искал, спасибо за помощь. Мы используем стандартный JDBC по причинам, по которым неизвестное родное соединение использовалось для совершения вызовов пакетов. Во время которого мы извлекаем соединение с помощью nativeC3P0Extractor из источника данных. – MADDY987

+0

@ MADDY987 Если мой ответ помог вам решить проблему, пожалуйста, подумайте о том, чтобы принять мой ответ, см. Также http://stackoverflow.com/help/someone-answers –

Смежные вопросы