Пул соединений — это операция, в которой система предварительно инициализирует соединения, которые будут использоваться в будущем. Это сделано, поскольку создание соединений во время использования является дорогостоящей операцией. В этом посте мы узнаем, как создать пул соединений 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" ?> xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:p = "http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans <!-- 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; } } |
Ссылка: | Добавление пула соединений C3PO весной JDBC от нашего партнера по JCG Чана Аршада из блога Java My G.Friend . |