Как закрыть соединение jdbc, созданное через Spring?

Я создал приложение (app1), которое просматривает и записывает определенные поля в базе данных. Это приложение использует базу данных совместно с другим приложением (app2), которое требует отдельного подключения к нему при запуске, но может разрешать другие подключения к БД после его запуска (app2). В моем приложении (app1) я создал объект dao, используя Spring для подключения к БД, и, очевидно, соединение никогда не закрывается, что приводит к сбою app2 при запуске. Из того, что я читал, Spring должен автоматически открывать и закрывать все соединения с БД, которыми он управляет. Я не уверен в каком-либо коде, которым я мог бы поделиться, чтобы помочь нарисовать лучшую картину моей проблемы, но если какой-то понадобится, я опубликую то, что смогу. Спасибо за любую помощь.


person lancex    schedule 17.12.2012    source источник
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
comment
Если Spring поддерживает соединение в пуле, как сказал GriffeyDog, могу ли я войти и как-то закрыть его? - person lancex; 17.12.2012
comment
зачем вам это делать, тогда какова цель пула соединений. - person Subin Sebastian; 17.12.2012
comment
@lancex, похоже, вы неправильно понимаете использование пула соединений - идея состоит в том, чтобы точно держать соединения открытыми и никогда не закрывать их, а только освобождать их для будущего использования. Таким образом, вам не придется платить за повторное установление соединения снова и снова. - person Óscar López; 17.12.2012
comment
Вы правы, я не совсем понимаю его использование. Если он действительно использует пул соединений так, как вы описываете, заставит ли приложение app2 увидеть открытое соединение, а затем потерпеть неудачу? - person lancex; 17.12.2012
comment
@lancex Я не знаю специфики вашей среды, оба приложения используют Spring? они используют ту же конфигурацию шаблона? правильно ли настроен пул? Определяет ли он достаточно соединений с базой данных для обслуживания обоих приложений? - person Óscar López; 17.12.2012
comment
Я не верю, что приложение2 использует Spring, оно было разработано третьей стороной давным-давно. Технически у меня есть доступ к конфигурационному файлу, чтобы заставить его запускаться независимо от того, есть ли у него единственное соединение или нет, но мое начальство говорит мне, что они предпочли бы, чтобы мое соединение было закрыто, если это возможно. В принципе, я могу рассмотреть любую конфигурацию для app2 вне пределов: / - person lancex; 18.12.2012
comment
@lancex единственное, что я могу придумать, что приводит к сбою app2 из-за того, что оно не может получить соединение, это то, что app1 исчерпывает все доступные соединения в базе данных, я бы перепроверил настроенное максимальное количество подключений базы данных по сравнению с максимальным количеством подключений Spring. В базе данных должно остаться несколько свободных соединений для использования другими приложениями, такими как app2. - person Óscar López; 18.12.2012
comment
@lancex Если этот ответ был вам полезен, не забудьте принять его;) - person Óscar López; 18.12.2012
comment
Ну, я знаю, что app1 использует только одно соединение, и что после запуска app2 все в порядке. Я думаю, проблема в том, что app2 хочет иметь единственное соединение с БД во время запуска, а Spring по-прежнему имеет открытое для него соединение из app1. Думаешь, я на правильном пути? - person lancex; 18.12.2012
comment
@lancex Я сомневаюсь, что app1 принимает только одно соединение, вам следует проверить конфигурацию пула Spring. И в любом случае убедитесь, что в базе данных настроено достаточно подключений для обслуживания как пула app1, так и одного подключения app2, а также еще пара свободных (для консолей администратора и т. д.) - person Óscar López; 18.12.2012
comment
Дело в том, что 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