共计 7287 个字符,预计需要花费 19 分钟才能阅读完成。
JDBC 的数据库连接池应用 javax.sql.DataSource 来示意,DataSource 只是一个接口,该接口通常由服务器 (Weblogic, WebSphere, Tomcat) 提供实现,也有一些开源组织提供实现:
1、DBCP 数据库连接池
2、C3P0 数据库连接池
DataSource 通常被称为数据源,它蕴含连接池和连接池治理两个局部,习惯上也常常把 DataSource 称为连接池
1、DBCP 数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源零碎:Common-pool. 如需应用该连接池实现,应在零碎中减少如下两个 jar 文件:
1)Commons-dbcp.jar:连接池的实现
2)Commons-pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采纳该连接池来实现的。该数据库连接池既能够与应用服务器整合应用,也可由应用程序独立应用。
留神:
数据源和数据库连贯不同,数据源无需创立多个,它是产生数据库连贯的工厂,因而整个利用只须要一个数据源即可。
当数据库拜访完结后,程序还是像以前一样敞开数据库连贯:conn.close(); 但 conn.close()并没有敞开数据库的物理连贯,它仅仅把数据库连贯开释,归还给了数据库连接池。
形式一:
示例代码:
步骤:
1、退出两个 jar
DBCP 数据库连接池的的 jar:Commons-dbcp.jar
连接池实现的依赖库:Commons-pool.jar,如果不加这个,运行报如下异样
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
at com.jdbc.datasource.TestDBCP.main(TestDBCP.java:14)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool.KeyedObjectPoolFactory
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
… 1 more
2、编写代码
package com.jdbc.datasource;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
public class TestDBCP {
public static void main(String[] args) throws SQLException {
//1. 创立 DBCP 数据源(即连接池)
BasicDataSource ds = new BasicDataSource();
//2. 设置数据源的必须属性
ds.setDriverClassName(“com.mysql.jdbc.Driver”);
ds.setUrl(“jdbc:mysql://localhost:3306/test”);
ds.setUsername(“root”);
ds.setPassword(“root”);
//3. 设置数据源的可选属性
//(1) 指定数据库连接池中初始化连接数的个数
ds.setInitialSize(10);
//(2)指定最大的连接数: 同一时刻能够同时向数据库申请的连接数
ds.setMaxActive(50);
//(3)在数据库连接池中保留的起码的闲暇连贯的数量
ds.setMinIdle(2);
//(4)期待数据库连接池调配连贯的最长工夫. 单位为毫秒. 超出该工夫将抛出异样.
ds.setMaxWait(1000*5);
//4. 从数据源中获取数据库连贯
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
测试超过连接数
package com.jdbc.datasource;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
public class TestDBCP2 {
public static void main(String[] args) throws SQLException {
//1. 创立 DBCP 数据源(即连接池)
BasicDataSource ds = new BasicDataSource();
//2. 设置数据源的必须属性
ds.setDriverClassName(“com.mysql.jdbc.Driver”);
ds.setUrl(“jdbc:mysql://localhost:3306/test”);
ds.setUsername(“root”);
ds.setPassword(“root”);
//3. 设置数据源的可选属性
//(1) 指定数据库连接池中初始化连接数的个数
ds.setInitialSize(3);
//(2)指定最大的连接数: 同一时刻能够同时向数据库申请的连接数
ds.setMaxActive(5);
//(3)指定最小沉闷的连接数: 在数据库连接池中保留的起码的闲暇连贯的数量
ds.setMinIdle(2);
//(4)期待数据库连接池调配连贯的最长工夫. 单位为毫秒. 超出该工夫将抛出异样.
ds.setMaxWait(1000*5);
//4. 从数据源中获取数据库连贯
for(int i=0;i<6;i++){
Connection conn = ds.getConnection();
System.out.println(“ 获取第 ”+(i+1)+” 个 ”+conn);
// 这里没有敞开,即没有放回连接池
}
}
}
测试如果连贯重复使用
package com.jdbc.datasource;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;
public class TestDBCP3 {
public static void main(String[] args) throws SQLException {
//1. 创立 DBCP 数据源(即连接池)
BasicDataSource ds = new BasicDataSource();
//2. 设置数据源的必须属性
ds.setDriverClassName(“com.mysql.jdbc.Driver”);
ds.setUrl(“jdbc:mysql://localhost:3306/test”);
ds.setUsername(“root”);
ds.setPassword(“root”);
//3. 设置数据源的可选属性
//(1) 指定数据库连接池中初始化连接数的个数
ds.setInitialSize(3);
//(2)指定最大的连接数: 同一时刻能够同时向数据库申请的连接数
ds.setMaxActive(5);
//(3)指定最小沉闷的连接数: 在数据库连接池中保留的起码的闲暇连贯的数量
ds.setMinIdle(2);
//(4)期待数据库连接池调配连贯的最长工夫. 单位为毫秒. 超出该工夫将抛出异样.
ds.setMaxWait(1000*5);
//4. 从数据源中获取数据库连贯
for(int i=0;i<10;i++){
new Thread(){
public void run(){
try {
Connection conn = ds.getConnection();
System.out.println(“ 获取 1 个 ”+conn);
Thread.sleep(3000);
// 隔 3 秒换回去
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}
}
形式二:
优化代码:
间接应用 BasicDataSource,耦合,而且在代码中须要很多 setXxx()设置属性值
应用 dbcp.properties 属性配置文件和 BasicDataSourceFactory 更灵便
步骤:
- 加载 dbcp 的 properties 配置文件: 配置文件中的键须要来自 BasicDataSource 的属性.
- 调用 BasicDataSourceFactory 的 createDataSource 办法创立 DataSource 实例
- 从 DataSource 实例中获取数据库连贯.
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
initialSize=3
maxActive=5
minIdle=2
maxWait=5000
package com.jdbc.datasource;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class TestDBCP3 {
public static void main(String[] args) throws Exception {
//1. 获取配置文件信息
// 留神:配置文件中的 key 来自 BasicDataSourceFactory 的属性(set 办法前面单词首字母改小写即可)
Properties pro = new Properties();
pro.load(ClassLoader.getSystemResourceAsStream(“dbcp.properties”));
//2. 创立 DBCP 数据源(即连接池)
DataSource ds = BasicDataSourceFactory.createDataSource(pro);
//3. 从数据源中获取数据库连贯
Connection conn = ds.getConnection();
System.out.println(“ 获取 1 个 ”+conn);
}
}
JDBCUtils 批改 DBCP 版:
package com.atguigu.utils;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBCPUtils {
private static Properties pro = new Properties();
private static DataSource ds ;
static{
try {
// 加载,读取 jdbc.properties 配置的信息
pro.load(ClassLoader.getSystemClassLoader().getResourceAsStream(“dbcp.properties”));
// 创立池子
ds = BasicDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection()throws Exception{
return ds.getConnection();
}
}
2、C3P0 数据源
C3P0 是一个开源的 JDBC 连接池,它实现了数据源和 JNDI 绑定,反对 JDBC3 标准和 JDBC2 的规范扩大。目前应用它的开源我的项目有 Hibernate,Spring 等。
c3p0 与 dbcp 区别
dbcp 没有主动回收闲暇连贯的性能
c3p0 有主动回收闲暇连接功能
形式一:
步骤:
1、退出 jar
如果是 c3p0-0.9.1.2 版本,退出一个 jar 即可 c3p0-0.9.1.2.jar
如果是 c3p0-0.9.2 之后的版本,须要退出两个 jar:c3p0-0.9.X.jar 和 mchange-commons-java-XX.jar
2、编写代码
package com.jdbc.datasource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class TestC3P0 {
public static void main(String[] args)throws Exception {
//1、创立 c3p0 数据源对象
ComboPooledDataSource ds = new ComboPooledDataSource();
//2、设置必须属性
ds.setDriverClass(“com.mysql.jdbc.Driver”);
ds.setJdbcUrl(“jdbc:mysql://localhost:3306/test”);
ds.setUser(“root”);
ds.setPassword(“root”);
//3、获取连贯
System.out.println(ds.getConnection());
}
}
形式二:
步骤:
- 在 src 目录创立 c3p0-config.xml 文件, 参考帮忙文档中 Appendix B: Configuation Files 的内容
- 创立 ComboPooledDataSource 实例;
DataSource dataSource = new ComboPooledDataSource(“helloc3p0”);
- 从 DataSource 实例中获取数据库连贯.
<?xml version=”1.0″ encoding=”UTF-8″?>
<c3p0-config>
<named-config name=”helloc3p0″>[I1]
<!– 指定连贯数据源的根本属性 –>
<property name=”user”>root</property>
<property name=”password”>root</property>
<property name=”driverClass”>com.mysql.jdbc.Driver</property>
<property name=”jdbcUrl”>jdbc:mysql://localhost:3306/test</property>
<!– 若数据库中连接数有余时, 一次向数据库服务器申请多少个连贯 –>
<property name=”acquireIncrement”>5</property>
<!– 初始化数据库连接池时连贯的数量 –>
<property name=”initialPoolSize”>5</property>
<!– 数据库连接池中的最小的数据库连接数 –>
<property name=”minPoolSize”>5</property>
<!– 数据库连接池中的最大的数据库连接数 –>
<property name=”maxPoolSize”>10</property>
</named-config>
</c3p0-config>
package com.jdbc.datasource;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class TestC3P02 {
public static void main(String[] args)throws Exception {
DataSource dataSource = new ComboPooledDataSource(“helloc3p0”);
System.out.println(dataSource.getConnection());
}
}
JDBCUtils 批改成 c3p0 版
package com.atguigu.utils;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3p0Utils {
// 创立数据源,用的是 c3p0-config.xml 文件中 <default-config>
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 获取数据源对象
public static ComboPooledDataSource getDataSource() {
return dataSource;
}
// 获取连贯
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
}
如果只有一个配置,那么能够应用 <default-config></default-config>,代替 <name-config name=””> </named-config>
这样在 new ComboPooledDataSource()就能够应用无参结构了。
关键词:java 培训