數據庫連接池
爲什麼要有連接池?
由於建立數據庫連接是一種非常耗時、耗資源的行爲,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,使用完畢後再歸還到連接池中,能明顯提高對數據庫操作的性能。
一、DBCP連接池
DBCP(DataBase Connection Pool)數據庫連接池,是Java數據庫連接池的一種,由Apache開發,通過數據庫連接池,可以讓程序自動管理數據庫連接的釋放和斷開。
使用步驟:
1、導入 jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2、配置信息
採用硬編碼方式
//創建連接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///mydb");
ds.setUsername("root");
ds.setPassword("123456");
//ds.setMaxWait(5000); //設置最大等待連接時間
//其他參數也可自行調用方法設置,不設置即爲默認值
採用配置文件方式
Java代碼
Properties properties = new Properties();
properties.load(new FileReader("src/dbcp.properties"));
//創建一個工廠,獲取連接池
DataSource ds = new BasicDataSourceFactory().createDataSource(properties);
配置文件
#連接基本設置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=123456
#<!--擴展配置 瞭解-->
#初始化連接
initialSize=10
#最大連接數量
maxActive=50
#<!-- 最大空閒連接 -->
maxIdle=20
#<!-- 最小空閒連接 -->
minIdle=5
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒 -->
maxWait=60000
#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;]
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=gbk
#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true
#driver default 指定由連接池所創建的連接的只讀(read-only)狀態。
#如果沒有設置該值,則“setReadOnly”方法將不被調用。(某些驅動並不支持只讀模式,如:Informix)
defaultReadOnly=
#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED
3、獲取連接對象
Connection conn = ds.getConnection();
二、C3P0連接池
C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。
使用步驟:
1、導入jar包(c3p0-0.9.1.2.jar)
2、配置信息
採用硬編碼方式
ComboPooledDataSource ds = new ComboPooledDataSource();
//設置基本參數
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql:///mydb");
ds.setUser("root");
ds.setPassword("123456");
採用配置文件方式
採用此方式需注意:
要求1:配置文件的名稱:c3p0.properties 或者 c3p0-config.xml
要求2:配置文件的路徑:必須在 src 下
//new ComboPooledDataSource() //使用默認的配置
//使用命名的配置 若配置的名字找不到,使用默認的配置
//new ComboPooledDataSource(String configName)
//c3p0-config.xml的第二種配置
ComboPooledDataSource ds = new ComboPooledDataSource("MyConfig");
c3p0.properties
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///mydb
c3p0.user=root
c3p0.password=123456
c3p0-config.xml
<c3p0-config>
<!-- 默認配置,如果沒有指定則使用這個配置 -->
<default-config>
<!-- 基本配置 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--擴展配置-->
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置 第二配置 -->
<named-config name="MyConfig">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/mydb</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--擴展配置-->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">20</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">40</property>
<property name="maxStatements">20</property>
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
3、獲取連接對象
Connection conn = ds.getConnection();
三、Druid 阿里德魯伊連接池
DRUID是阿里巴巴開源平臺上一個數據庫連接池實現,它結合了C3P0、DBCP、PROXOOL等DB池的優點,同時加入了日誌監控,可以很好的監控DB池連接和SQL的執行情況,可以說是針對監控而生的DB連接池。
使用步驟:
1、導入jar包(druid-1.1.9.jar)
2、配置信息
採用硬編碼方式
//創建數據源
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///mydb");
ds.setUsername("root");
ds.setPassword("123456");
採用配置文件方式
Properties properties = new Properties();
properties.load(new FileReader("src/druid.properties"));
//通過一個工廠類,創建一個數據源
DataSource ds =new DruidDataSourceFactory().createDataSource(properties);
配置文件
#基本配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/mydb
username=root
password=123456
#可選配置
filters=stat
initialSize=2
maxActive=300
maxWait=60000
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
3、獲取連接對象
Connection conn = ds.getConnection();
DBUtils 工具類庫
Commons DbUtils 是Apache組織提供的一個對JDBC進行簡單封裝的開源工具類庫,
使用它能夠簡化JDBC應用程序的開發,同時也不會影響程序的性能。
//導入jar包(commons-dbutils-1.4.jar)
//創建 QueryRunner 對象
Properties properties = new Properties();
properties.load(new FileReader("src/druid.properties"));
DataSource dataSource = new DruidDataSourceFactory().createDataSource(properties);
//注意傳入數據源
QueryRunner queryRunner = new QueryRunner(dataSource);
//編寫執行SQL語句
//編寫執行DML、DQL語句 返回值:影響的行數 參2、參3爲問號的值
int i = queryRunner.update("insert into users values(?,?)", "張三", "123456");
//查詢語句
//BeanListHandler 把從數據庫查出來的多條數據,封裝到對象裏面,再把對象放到集合裏面
List<User> list = queryRunner.query("select * from users", new BeanListHandler<User>(User.class));
//BeanHandler 查詢一條結果,把這個結果封裝進對象裏面
User user = queryRunner.query("select * from users", new BeanHandler<User>(User.class));
// MapHandler 把查詢的結果封裝到Map集合裏面
Map<String, Object> map = queryRunner.query("select * from users", new MapHandler());