Управление подключением к базе данных в Spring - PullRequest
3 голосов
/ 12 февраля 2010

Нужно ли нам явно управлять ресурсами базы данных при использовании Spring Framework ... нравится закрывать все открытые соединения и т. Д.?

Я читал, что Spring освобождает разработчика от такого кодирования котельной плиты ...

Это ответ на ошибку, которую я получаю в веб-приложении Spring:

org.springframework.jdbc.CannotGetJdbcConnectionException: Не удалось получить соединение JDBC; вложенными Исключение составляет java.sql.SQLException: ORA-00020: максимальное количество процессов (150) превышено

jdbcTemplate сконфигурирован в файле xml, и реализация DAO имеет ссылку на этот компонент jdbcTemplate, который используется для запроса базы данных.

Ответы [ 5 ]

2 голосов
/ 12 февраля 2010

Нужно ли нам явно управлять ресурсами базы данных при использовании Spring Framework, например закрывать все открытые соединения и т. Д.?

Если вы используете абстракцию Spring, такую ​​как JbdcTemplate, Spring справится с этим за вас, и очень маловероятно, что в этой части есть ошибка.

Теперь, без дополнительной информации о вашей конфигурации (ваше applicationContext.xml), о контексте (как вы создаете контекст приложения, когда это происходит точно?), Трудно что-либо сказать. Так что это выстрел в темноте: у вас установлен атрибут destroy-method="close" в вашей конфигурации источника данных? Примерно так:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

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

0 голосов
/ 24 января 2013

Мой шланг обеспечивает только 20 соединений. Я сделал вручную закрыть соединение на каждый запрос к БД. Я не объявил метод бинтов в bean-компоненте (это не сработало «я не знаю почему»), но я делал это при каждом вызове requst. (Подсказка: расширяет JdbcDaoSupport в классе дао).

public void cleanUp() {
        try {
            if (!this.getJdbcTemplate().getDataSource().getConnection().isClosed()) {
                this.getJdbcTemplate().getDataSource().getConnection().close();
            }
        } catch (Exception e) {
            Logger.getLogger(myDAOImpl.class.getName()).log(Level.SEVERE, null, e);
        }
    }
0 голосов
/ 12 февраля 2010

вы говорите "jdbcTemplate настроен в XML-файле". Обычно вы должны создавать новый экземпляр jdbcTemplate для каждого использования, а не управлять им весной.

Я бы предположил, что каждый раз, когда вы запрашиваете новый bean-компонент jdbcTemplate у Spring, он создает новый с новым подключением к базе данных, но после того, как он выходит из области видимости в вашем коде, на него по-прежнему ссылается springContext application и так не закрывает соединение.

0 голосов
/ 12 февраля 2010

Я читал, что весна облегчает проявитель из такой котельной плиты кодирование

Это зависит от того, на каком уровне Spring вы работаете. JdbcTemplate предоставляет множество различных операций, некоторые из которых запускаются и забываются, а некоторые требуют правильного управления ресурсами JDBC (соединения, наборы результатов, операторы и т. Д.). Практическое правило гласит, что если вы звоните getConnection(), то в какой-то момент вам также необходимо позвонить releaseConnection().

ORA-00020: максимальное количество процессов (150) превышено

Вы используете пул соединений? Если это так, то убедитесь, что он не сконфигурирован с большим количеством макс. Соединений, чем ваша база данных способна обработать (в данном случае 150). Если вы не используете пул соединений, то вам действительно следует это сделать.

0 голосов
/ 12 февраля 2010

Это может быть связано с тем, что соединения не закрыты. Как вы получаете доступ к своим связям в течение весны? Вы используете JdbcTemplate для запроса базы данных? Или просто получить связь с весны?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...