Как правильно обрабатывать соединения JDBC с помощью Spring и DBCP?

Я использую Spring MVC для создания тонкого слоя поверх базы данных SQL Server. Когда я начал тестирование, кажется, что он не очень хорошо справляется со стрессом :). я используюApache Commons DBCP обрабатывать пул соединений и источник данных.

Когда я впервые пытался установить ~ 10-15 одновременных подключений, он зависал, и мне приходилось перезагружать сервер (для разработчика я использую Tomcat, но в конечном итоге мне придется развернуться на Weblogic).

Это мои определения Spring Bean:

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="[...]"/>
    <property name="username" value="[...]" />
    <property name="password" value="[...]" />
</bean>

<bean id="partnerDAO" class="com.hp.gpl.JdbcPartnerDAO">
    <constructor-arg ref="dataSource"/>
</bean>

<!-- + other beans -->

И вот как я их использую:

// in the DAO
public JdbcPartnerDAO(DataSource dataSource) {
    jdbcTemplate = new JdbcTemplate(dataSource);
}

// in the controller
@Autowired
private PartnerDAO partnerDAO;

// in the controller method
Collection<Partner> partners = partnerDAO.getPartners(...);

Прочитав немного, я нашелmaxWait, maxActive а такжеmaxIdle свойства дляBasicDataSource (отGenericObjectPool). Здесь возникает проблема. Я не уверен, как я должен установить их, с точки зрения производительности. Из того, что я знаю, Spring должен управлять моими соединениями, поэтому мне не нужно беспокоиться об их освобождении.

<bean id="dataSource" destroy-method="close"
      class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="[...]"/>
    <property name="username" value="[...]" />
    <property name="password" value="[...]" />
    <property name="maxWait" value="30" />
    <property name="maxIdle" value="-1" />
    <property name="maxActive" value="-1" />
</bean>

Сначала я установилmaxWait, чтобы он не зависал и вместо этого выдавал исключение, когда из пула не было доступного соединения. Сообщение об исключении было:

Не удалось получить соединение JDBC; Вложенное исключение: org.apache.commons.dbcp.SQLNestedException: не удается получить соединение, ошибка пула Тайм-аут ожидания незанятого объекта

Есть несколько длительных запросов, но исключение было выдано независимо от сложности запроса.

Затем я установил maxActive и maxIdle, чтобы он не выдавал исключения в первую очередь. Значения по умолчанию 8 дляmaxActive а такжеmaxIdle (Я не понимаю почему); если я установлю их на -1, больше не будет исключений, и всекажется работать нормально.

Учитывая, что это приложение должно поддерживать большое количество одновременных запросов, можно ли оставить эти настройки бесконечными? Будет ли Spring фактически управлять моими соединениями, учитывая ошибки, которые я получал? Должен ли я переключиться наC3P0 учитывая, что он вроде мертв?

Ответы на вопрос(3)

Ваш ответ на вопрос