一個小應用的dbcp和c3p0配置例項

baibaluo發表於2013-07-12

以下是一個小應用的資料庫連線池配置,包括DBCP和C3P0的配製方法

因為是小應用,完全不涉及訪問壓力,所以配置上採取儘量節約資料庫資源的方式

具體要求如下:
初始化連線數為0
連線不夠,需要新建立時,每次建立1個
儘快回收空閒連線
需要開啟prepareStatement快取

具體用程式碼來說明

 1 package com.yazuo.util;
 2 
 3 import com.mchange.v2.c3p0.ComboPooledDataSource;
 4 import org.apache.commons.dbcp.BasicDataSource;
 5 import org.slf4j.Logger;
 6 import org.slf4j.LoggerFactory;
 7 import org.springframework.jdbc.core.JdbcTemplate;
 8 
 9 import java.util.Map;
10 
11 /**
12  * Created by IntelliJ IDEA.
13  * User: Luo
14  * Date: 13-6-19
15  * Time: 下午3:33
16  */
17 public class JdbcTemplateFactory {
18     static Logger log = LoggerFactory.getLogger(JdbcTemplateFactory.class);
19 
20     private static JdbcTemplate jdbcTemplate;
21 
22 
23     /**
24      * 獲取單例的jdbcTemplate,基於c3p0
25      *
26      * @return
27      */
28     public static JdbcTemplate getJdbcTemplate() {
29         if (jdbcTemplate == null) {
30             synchronized (JdbcTemplateFactory.class) {
31                 if (jdbcTemplate == null) {
32                     try {
33                         //讀取配置檔案
34                         Map<String, String> jdbcProps = PropertiesUtil.getPropertiesMap("jdbc.properties");
35                         //建立連線池
36                         ComboPooledDataSource dataSource = new ComboPooledDataSource();
37                         dataSource.setJdbcUrl(jdbcProps.get("jdbc.url"));
38                         dataSource.setUser(jdbcProps.get("jdbc.username"));
39                         dataSource.setPassword(jdbcProps.get("jdbc.password"));
40                         //預設初始化連線為3,設定為0
41                         dataSource.setInitialPoolSize(0);
42                         //預設每次建立連線數為3,設定為1
43                         dataSource.setAcquireIncrement(1);
44                         //預設最小連線數是3,設定為0
45                         dataSource.setMinPoolSize(0);
46                         //預設最長空閒時間為0,即不會回收空閒連線,設定為10秒
47                         dataSource.setMaxIdleTime(10);
48                         //預設為不開啟 prepareStatement 快取,設定為最大快取5個
49                         dataSource.setMaxStatements(5);
50                         jdbcTemplate = new JdbcTemplate(dataSource);
51                     } catch (Exception e) {
52                         throw new IllegalStateException("資料庫連線建立失敗", e);
53                     }
54                 }
55             }
56         }
57         return jdbcTemplate;
58     }
59 
60     /**
61      * 獲取單例的jdbcTemplate,基於dbcp
62      *
63      * @return
64      */
65     public static JdbcTemplate getJdbcTemplateByDbcp() {
66         if (jdbcTemplate == null) {
67             synchronized (JdbcTemplateFactory.class) {
68                 if (jdbcTemplate == null) {
69                     try {
70                         //讀取配置檔案
71                         Map<String, String> jdbcProps = PropertiesUtil.getPropertiesMap("jdbc.properties");
72                         //建立連線池
73                         BasicDataSource dataSource = new BasicDataSource();
74                         dataSource.setUrl(jdbcProps.get("jdbc.url"));
75                         dataSource.setUsername(jdbcProps.get("jdbc.username"));
76                         dataSource.setPassword(jdbcProps.get("jdbc.password"));
77                         dataSource.setInitialSize(3);
78 
79                         //預設為不起動回收器,設定為30秒執行一次回收器
80                         dataSource.setTimeBetweenEvictionRunsMillis(30 * 1000);
81                         //預設為30分鐘不使用的連線被認為空閒,設定為10秒鐘
82                         dataSource.setMinEvictableIdleTimeMillis(10 * 1000);
83                         //開啟 prepareStatement 快取
84                         dataSource.setPoolPreparedStatements(true);
85                         jdbcTemplate = new JdbcTemplate(dataSource);
86                     } catch (Exception e) {
87                         throw new IllegalStateException("資料庫連線建立失敗", e);
88                     }
89                 }
90             }
91         }
92         return jdbcTemplate;
93     }
94 
95 }

 

相關文章