Я использую Spring MVC для создания тонкого слоя поверх базы данных SQL Server.Когда я начал тестирование, кажется, что он не очень хорошо справляется со стрессом :).Я использую Apache Commons DBCP для обработки пула соединений и источника данных.
Когда я впервые попробовал ~ 10-15 одновременных подключений, он зависал, и мне приходилось перезагружать сервер (для разработчика я использую Tomcat, но в конечном итоге мне придется развернуться на Weblogic).
Вот мои определения бинов 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="[...]" />
</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 , учитывая, что он вроде мертв?