Как правильно обрабатывать соединения 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 учитывая, что он вроде мертв?