Инициализация DBCP2 - PullRequest
       25

Инициализация DBCP2

0 голосов
/ 02 марта 2020

Я использую DBCP2 с Spring Security (XML конфигурация). Моя проблема в том, что каждый раз, когда я выполняю INSERT или UPDATE, создаю соединения (initialSize = 100), поэтому через некоторое время я получаю «Слишком много соединений».

Я не знаю, сделал ли я что-то неправильно в моей конфигурации или на другом шаге.

Это моя конфигурация:

1. springSecurity. xml file

<beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
       <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
       <beans:property name="url" value="${bd.url}" />
       <beans:property name="username" value="${bd.user}" />
       <beans:property name="password" value="${bd.password}" />
       <beans:property name="validationQuery" value="SELECT 1" />
       <beans:property name="removeAbandonedTimeout" value="30" />
       <beans:property name="removeAbandonedOnBorrow" value="true" />
       <beans:property name="removeAbandonedOnMaintenance" value="true" />
       <beans:property name="initialSize" value="100" />
       <beans:property name="maxTotal" value="1000" />
       <beans:property name="maxIdle" value="50" />
       <beans:property name="timeBetweenEvictionRunsMillis" value="30" />        
   </beans:bean>

<beans:bean id="npjt" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" >
     <beans:constructor-arg ref="dataSource"/>
</beans:bean>

<beans:bean id="DAOEmail" class="general.Email"  >  
       <beans:property name="npjt" ref="npjt" />
</beans:bean> 

<beans:bean id="DAOAddress" class="general.Address" >  
    <beans:property name="npjt" ref="npjt" />
</beans:bean> 

<beans:bean id="DAOPhone" class="general.Phone" >  
    <beans:property name="npjt" ref="npjt" />
</beans:bean> 

<beans:bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <beans:property name="dataSource" ref="dataSource"/>
</beans:bean>

<tx:annotation-driven transaction-manager="txManager"/>

2. ДАО

public interface DAOEmail{
    public void save(HashMap<String, String> params);
    public void update(HashMap<String, String> params);
}

public interface DAOPhone{
    public void save(HashMap<String, String> params);
    public void update(HashMap<String, String> params);
}

public interface DAOAddress{
    public void save(HashMap<String, String> params);
    public void update(HashMap<String, String> params);
}

3. Вызов из сервлета

 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springSecurity.xml");
 DAOAddress dao = (DAOAddress) context.getBean("DAOAddress");
 dao.save(params);
 context.registerShutdownHook();

Тот же процесс для каждого сервлета (телефон, электронная почта, адрес)

4. Операции с файлом (адрес, телефон, электронная почта)

public class Address implements DAOAddress {

    private NamedParameterJdbcTemplate npjt;

    public NamedParameterJdbcTemplate getNpjt() {
        return npjt;
    }

    public void setNpjt(NamedParameterJdbcTemplate npjt) {
        this.npjt = npjt;
    }

    @Transactional
    @Override
    public void save(HashMap<String, String> params) {
       try { 
         ....
            npjt.update();  
         ....
       } catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
       }
    }


@Transactional
    @Override
    public void update(HashMap<String, String> params) {
      try { 
         ....
            npjt.update();  
         ....
       } catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
       }

    }

Спасибо !!!

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Необходимо изменить это значение в конфигурации источника данных.

<beans:property name="initialSize" value="100" />

"initialSize" в компоненте "dataSource" - это начальное количество соединений, которые создаются при запуске пула. Это значение в вашей конфигурации "100". Это два максимума.

Удалите это свойство, чтобы использовать значение по умолчанию (0), или используйте меньшее значение, чтобы решить вашу проблему.

0 голосов
/ 03 марта 2020

Попробуйте использовать простейшую конфигурацию для источника данных с минимальными параметрами, используйте значение по умолчанию для других, как показано ниже:

<beans:bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> 
       <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
       <beans:property name="url" value="${bd.url}" />
       <beans:property name="username" value="${bd.user}" />
       <beans:property name="password" value="${bd.password}" />
       <beans:property name="validationQuery" value="SELECT 1" />     
   </beans:bean>

Если указанная выше конфигурация может решить вашу проблему, добавьте другие параметры один за другим, чтобы проверить, какой параметр вызывает проблему.

Надеюсь, что решение выше может помочь.

...