以下是一個小應用的資料庫連線池配置,包括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 }