Я создал приложение (app1), которое просматривает и записывает определенные поля в базе данных. Это приложение использует базу данных совместно с другим приложением (app2), которое требует отдельного подключения к нему при запуске, но может разрешать другие подключения к БД после его запуска (app2). В моем приложении (app1) я создал объект dao, используя Spring для подключения к БД, и, очевидно, соединение никогда не закрывается, что приводит к сбою app2 при запуске. Из того, что я читал, Spring должен автоматически открывать и закрывать все соединения с БД, которыми он управляет. Я не уверен в каком-либо коде, которым я мог бы поделиться, чтобы помочь нарисовать лучшую картину моей проблемы, но если какой-то понадобится, я опубликую то, что смогу. Спасибо за любую помощь.
Как закрыть соединение jdbc, созданное через Spring?
comment
Spring закроет свои соединения, но если у вас есть пул соединений, пул, вероятно, сохранит фактическое физическое соединение с базой данных открытым.
- person GriffeyDog   schedule 17.12.2012
comment
Я думаю, это то, что мне нужно закрыть, где/как мне это сделать?
- person lancex   schedule 17.12.2012
comment
Это будет зависеть от конкретного используемого вами пула серверов/соединений. У него может быть настройка принудительного закрытия физического соединения после каждого использования. Обратите внимание, что это ухудшит производительность вашего приложения.
- person GriffeyDog   schedule 17.12.2012
comment
У вас есть атрибут destroy-method в вашем bean-компоненте шаблона jdbc?
- person dev   schedule 19.06.2013
Ответы (3)
Если вы используете шаблон JDBC, вам не нужно беспокоиться о явном закрытии соединений, Spring позаботится о внутреннем управлении пулом соединений и получении/освобождении соединений из этого пула.
person
Óscar López
schedule
17.12.2012
Если Spring поддерживает соединение в пуле, как сказал GriffeyDog, могу ли я войти и как-то закрыть его?
- person lancex; 17.12.2012
зачем вам это делать, тогда какова цель пула соединений.
- person Subin Sebastian; 17.12.2012
@lancex, похоже, вы неправильно понимаете использование пула соединений - идея состоит в том, чтобы точно держать соединения открытыми и никогда не закрывать их, а только освобождать их для будущего использования. Таким образом, вам не придется платить за повторное установление соединения снова и снова.
- person Óscar López; 17.12.2012
Вы правы, я не совсем понимаю его использование. Если он действительно использует пул соединений так, как вы описываете, заставит ли приложение app2 увидеть открытое соединение, а затем потерпеть неудачу?
- person lancex; 17.12.2012
@lancex Я не знаю специфики вашей среды, оба приложения используют Spring? они используют ту же конфигурацию шаблона? правильно ли настроен пул? Определяет ли он достаточно соединений с базой данных для обслуживания обоих приложений?
- person Óscar López; 17.12.2012
Я не верю, что приложение2 использует Spring, оно было разработано третьей стороной давным-давно. Технически у меня есть доступ к конфигурационному файлу, чтобы заставить его запускаться независимо от того, есть ли у него единственное соединение или нет, но мое начальство говорит мне, что они предпочли бы, чтобы мое соединение было закрыто, если это возможно. В принципе, я могу рассмотреть любую конфигурацию для app2 вне пределов: /
- person lancex; 18.12.2012
@lancex единственное, что я могу придумать, что приводит к сбою app2 из-за того, что оно не может получить соединение, это то, что app1 исчерпывает все доступные соединения в базе данных, я бы перепроверил настроенное максимальное количество подключений базы данных по сравнению с максимальным количеством подключений Spring. В базе данных должно остаться несколько свободных соединений для использования другими приложениями, такими как app2.
- person Óscar López; 18.12.2012
@lancex Если этот ответ был вам полезен, не забудьте принять его;)
- person Óscar López; 18.12.2012
Ну, я знаю, что app1 использует только одно соединение, и что после запуска app2 все в порядке. Я думаю, проблема в том, что app2 хочет иметь единственное соединение с БД во время запуска, а Spring по-прежнему имеет открытое для него соединение из app1. Думаешь, я на правильном пути?
- person lancex; 18.12.2012
@lancex Я сомневаюсь, что app1 принимает только одно соединение, вам следует проверить конфигурацию пула Spring. И в любом случае убедитесь, что в базе данных настроено достаточно подключений для обслуживания как пула app1, так и одного подключения app2, а также еще пара свободных (для консолей администратора и т. д.)
- person Óscar López; 18.12.2012
Дело в том, что SQL Server Management Studio показывает только одно соединение для приложения1, и когда я говорю ему завершить соединение, приложение2 запускается нормально. Затем я запускаю app1, и все работает как надо:/ Думаю, я начну гуглить все о том, как настроить пул соединений Spring... РЕДАКТИРОВАТЬ: мне даже не нужно перезапускать app1, он сам переподключается после запуска app2.
- person lancex; 18.12.2012
При совместном использовании соединений между приложениями я бы рекомендовал использовать пул соединений. Открытие и закрытие соединений может быть выполнено путем декларативного разграничения транзакций с помощью аннотаций (@Transactional).
http://faheemsohail.com/2012/01/configuring-c3p0-connection-pooling-with-spring-and-hibernate/
person
sorencito
schedule
17.12.2012
Будет ли это работать для вас?
public void closeCon() {
{
if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
person
DRastislav
schedule
17.12.2012