Статьи

Добавление пула соединений C3PO в Spring JDBC

Пул соединений — это операция, в которой система предварительно инициализирует соединения, которые будут использоваться в будущем. Это сделано, поскольку создание соединений во время использования является дорогостоящей операцией. В этом посте мы узнаем, как создать пул соединений C3P0 в Spring JDBC (кто-то не использует hibernate).

pom.xml

1
2
3
4
5
<dependency>
    <groupId>c3p0</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.1.2</version>
</dependency>

Файл контекста Spring (ApplicaitonContext-persistance.xml)

Теперь нам нужно подготовить файл контекста JDBC к весне. Нам нужно определить источник данных для БД со всеми ее учетными данными.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8"?>
 
 
 
 
 
 
 
 
 
 
 
    <!-- Employee DB data source. -->
    <bean id="employeeDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.employee_db_url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
        <property name="minPoolSize" value="${jdbc.minPoolSize}" />
        <property name="maxStatements" value="${jdbc.maxStatements}" />
        <property name="testConnectionOnCheckout" value="${jdbc.testConnection}" />
    </bean>
     
    <context:component-scan base-package="com.javapitshop.dao">
    </context:component-scan>
</beans>

В приведенном выше примере мы создали источник данных C3P0 для БД сотрудника со всеми его учетными данными и соответствующими параметрами. Все учетные данные и настройки не упоминаются в файле контекста. Я использовал специальный файл свойств для этого. Теперь этот компонент может быть автоматически подключен в любом классе DAO как объект DataSource.

jdbc.properties

1
2
3
4
5
6
7
8
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.employee_db_url=jdbc:mysql://localhost:3306/employee
jdbc.username=root
jdbc.password=root
jdbc.maxPoolSize=50
jdbc.minPoolSize=10
jdbc.maxStatements=100
jdbc.testConnection=true

BaseDao Class

Базовый класс DAO предназначен для определения любого абстрактного метода или любой общей функциональности, которую мы должны использовать во всех дочерних классах. Мы можем сделать это абстракцией или чем угодно в соответствии с нашими потребностями. Также обратите внимание, что я перегружен его конструктором для реализации Logging. Теперь каждый дочерний класс должен предоставить свое определение класса.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.icsmobile.faadplatform.dao;
 
 
import org.apache.log4j.Logger;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
 
 
/**
 * Its the parent Dao class of the all the daos defined in the System.
 *
 * @author JavaPitShop
 */
public class BaseDao extends SimpleJdbcDaoSupport {
 
    //common logger for all the classes in the dao layer
    protected Logger logger;
     
    /**
     *
     * @param daoClass
     */
    public BaseDao(Class<?> daoClass) {
        logger = Logger.getLogger(daoClass);
    }
     
}

EmployeeJdbcDao.Java

EmployeeJdbcDao расширяет BaseDao и в своем конструкторе автоматически связывает «employeeDataSource», который мы определили в компоненте контекста.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Repository
public class EmployeeJdbcDAO extends BaseDao {
 
    /**
     * Instantiates a new employee jdbc dao.
     *
     * @param userDataSource the employee data source
     */
    @Autowired
    public ApplicationJdbcDAO(DataSource employeeDataSource) {
        super(ApplicationJdbcDAO.class);
        this.setDataSource(userDataSource);
    }
     
    public EmployeeBO getEmployeeById(final int employeeId) {
        logger.debug("getEmployeeById(" + employeeId + ")");
        EmployeeBO employeeBO = null;
        StringBuilder queryString = new StringBuilder();
 
        queryString.append(" SELECT ")
                   .append( "*" )  
                   .append(" FROM employee ")
                   .append(" WHERE employee_id = ? ");
 
        Object[] parameterList = { employeeId };
         
        logger.debug(queryString.toString());
         
        // execute query
        SqlRowSet dataRow = getJdbcTemplate().queryForRowSet(queryString.toString(), parameterList);
         
        if (dataRow.next()) {
            // create application object
            employeeBO = getEmployeeBusinessObjectFromRowSet(dataRow);
        }
 
        return employeeBO;
    }
}