使用JDBC连接数据库,每次连接都需要创建一个连接,执行完成之后,又将连接关闭,这样反复操作会浪费资源和消耗时间.
这一问题可以使用连接池技术解决,就是我们先创建一个池子,里面先创建好数据库的连接,每次使用都从里面去拿,用完之后在归还.这样可以省略每次连接数据创建的时间,避免资源浪费
数据库连接池概念:
其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
实现:
sun公司提供了一个标准接口,javax.sql包下的 DataSource,但是没有实现,一般由数据库的厂商实现.
这个接口提供了两个方法

我们可以自己实现这个接口,这里只是简单演示(但是一般不自己实现自己写的没有任何意义)
创建十个连接放入池子中
public class MydateSource implements DataSource {// 存放连接的池子private static LinkedList<Connection> pool = new LinkedList();// 先获取是个连接static {for (int i = 0; i < 10; i++) {Connection conn = null;try{conn = JDBCUtils.getConnection();//放入连接pool.add(conn);}catch (Exception e) {e.printStackTrace();}}}@Overridepublic Connection getConnection() throws SQLException {if(pool.size()>0){Connection conn = pool.removeFirst();return conn;}else{//处理一下}return null;}....................

使用装配设计模式解决问题
目的:改写已存在的类的某个方法或某些方法,装饰设计模式(包装模式)
口诀:
1、编写一个类,实现与被包装类相同的接口。(具备相同的行为)
2、定义一个被包装类类型的变量。
3、定义构造方法,把被包装类的对象注入,给被包装类变量赋值。
4、对于不需要改写的方法,调用原有的方法。
5、对于需要改写的方法,写自己的代码。
//1.编写一个类,实现与被包装类相同的接口。public class MyConnection implements Connection{//2.定义一个被包装类型的对象private Connection oldConnection;LinkedList<Connection> pool;//3、定义构造方法,把被包装类的对象注入,给被包装类变量赋值。public MyConnection(Connection oldConnection,LinkedList<Connection> pool) {this.oldConnection = oldConnection;this.pool = pool;}//5.对于需要改写的方法,写自己的代码。@Overridepublic void close() throws SQLException {//放回池子中pool.add(oldConnection);}//4对于不需要改写的方法,调用原有的方法。(底下都是)@Overridepublic <T> T unwrap(Class<T> iface) throws SQLException {return oldConnection.unwrap(iface);}........
修改; MydateSource代码

这样在测试代码中关闭的就是自己重写的close方法,放回了池子中
上述装饰设计模式中,在MyConnection中会有很多重写的方法,下面介绍适配器设计模式
默认适配器:装饰设计模式一个变体
本身就是一个适配器,没有任何变化
public class ConnectionWarper implements Connection{private Connection oldConnection;public ConnectionWarper(Connection oldConnection) {this.oldConnection = oldConnection;}@Overridepublic void close() throws SQLException {oldConnection.close();}@Overridepublic <T> T unwrap(Class<T> iface) throws SQLException {return oldConnection.unwrap(iface);}........
再写一个类继承这个适配器
public class MyConnectionWarper extends ConnectionWarper{private Connection conn;private LinkedList<Connection> pool;public MyConnectionWarper( Connection conn,LinkedList<Connection> pool) {super(conn);this.conn = conn;this.pool = pool;}//只需要重写你想要的方法@Overridepublic void close() throws SQLException {//处理自己的pool.add(conn);}}
以上都是自己实现的,任何意义,这里使用两种数据库连接池技术
C3P0
* 步骤:
1. 导入jar包 (两个 + 1个数据库驱动) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,* 不要忘记导入数据库驱动jar包 mysql-connector-java-5.1.43
2. 定义配置文件:* 名称:c3p0.properties 或者 c3p0-config.xml
* 路径:直接将文件放在src目录下即可。
3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
4. 获取连接:getConnection
这里使用配置文件的方式实现
<c3p0-config><!-- 使用默认的配置读取连接池对象 --><default-config><!-- 连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/db4</property><property name="user">root</property><property name="password">root</property><!-- 连接池参数 --><!--初始化申请的连接数量--><property name="initialPoolSize">5</property><!--最大的连接数量--><property name="maxPoolSize">10</property><!--超时时间--><property name="checkoutTimeout">3000</property></default-config></c3p0-config>
* c3p0的演示*/public class C3P0Demo1 {public static void main(String[] args) throws SQLException {//1.创建数据库连接池对象DataSource ds = new ComboPooledDataSource();//2. 获取连接对象Connection conn = ds.getConnection();//3. 打印System.out.println(conn);}}
这里可以指定文件名称配置
// 获取DataSource,使用指定名称配置DataSource ds = new ComboPooledDataSource("otherc3p0");
<named-config name="otherc3p0"><!-- 连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property><property name="user">root</property><property name="password">root</property><!-- 连接池参数 --><property name="initialPoolSize">5</property><property name="maxPoolSize">8</property><property name="checkoutTimeout">1000</property></named-config>
Druid:数据库连接池实现技术,由阿里巴巴提供的
步骤:
1. 导入jar包 druid-1.0.9.jar
2. 定义配置文件:* 是properties形式的
* 可以叫任意名称,可以放在任意目录下
3. 加载配置文件。Properties
4. 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
5. 获取连接:getConnection
配置文件信息
driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql:///db3username=rootpassword=root# 初始化连接数量initialSize=5# 最大连接数maxActive=10# 最大等待时间maxWait=3000
/*** Druid演示*/public class DruidDemo {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//3.加载配置文件Properties pro = new Properties();InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//4.获取连接池对象DataSource ds = DruidDataSourceFactory.createDataSource(pro);//5.获取连接Connection conn = ds.getConnection();System.out.println(conn);}}





