Проблема с пулом соединений JDBC - PullRequest
0 голосов
/ 21 августа 2010

У меня есть, я бы сказал, довольно большая проблема.

Я работаю над веб-приложением Java, которое использует пружины BasicDataSource для настройки соединения с БД. Я тестировал приложение локально, и оно прекрасно работает ... но когда приложение подключено к сети, соединение с БД в какой-то момент просто зависло. Я занимался исследованием пула подключений и выяснил, что при каждом новом HTTP-запросе, где выполняются некоторые запросы, создается новый пул. Как я знаю, пул вводится для повторного использования и не создается каждый раз, когда задействован новый доступ к БД. Или я не прав?

Вот мой весенний конфиг источника данных:

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="url"/>
        <property name="username" value="username"/>
        <property name="password" value="password"/>
        <property name="defaultAutoCommit" value="true"/>
 <property name="defaultTransactionIsolation" value="1"/>
 <property name="initialSize" value="0"/>
 <property name="maxActive" value="20"/>
 <property name="minIdle" value="0"/>
</bean>

Чем я настроил:

<bean id="EventDao" class="my.managament.database.class">
    <property name="dataSource" ref="dataSource"/>
</bean>

И mainPageController, который обрабатывает все HTTP-запросы, отправленные приложению

<bean id="mainController" class="my.management.main.controller.class">

В остальной части приложения я использую gedDatabase () для получения соединения с БД и выбираю через JDBCTemplate.

Где я ошибаюсь?

Спасибо

Ответы [ 2 ]

1 голос
/ 23 августа 2010

Вы хотите использовать dao, jdbcTemplate и dataSource через пул соединений. Я полагаю, что наиболее правильным подходом к вашей установке является наличие дао с полем JdbcTemplate и компонентом JdbcTemplate, созданным с помощью вашего компонента dataSource. Это будет выглядеть так:

public class MyDAO {
  private JdbcTemplate jdbcTemplate;

  // your dao methods using jdbcTemplate here
}

где jdbcTemplate происходит от бина, например:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <constructor-arg ref="dataSource">
</bean>

Вам никогда не нужно напрямую получать соединение с источником данных (который в вашем случае является пулом соединений на основе apache dbcp). JdbcTemplate получит само соединение при необходимости. Я не уверен, что такое gedDatabase, но похоже, что вы пытались установить соединение самостоятельно и, возможно, забыли закрыть его. Это приведет к быстрому исчерпанию соединений в пуле. После обработки 20 запросов последующие запросы будут зависать при попытке установить соединение из пула.

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

0 голосов
/ 22 августа 2010

Каков срок службы вашего EventDao? Вы вводите свой DataSource в свойство dataSource. Я подозреваю, что вы создаете несколько бинов EventDao, и каждый раз, когда вы создаете один, у вас появляется новый источник данных. Я думаю, что нам нужно больше понимать код, чтобы правильно ответить на ваш вопрос.

Мои два цента:
Насколько я понимаю, код и передача данных через XML - ужасный анти-паттерн.

...