暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库连接池

敲代码的人 2019-07-29
252

使用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();
}
}
}


@Override
public 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.对于需要改写的方法,写自己的代码。
@Override
public void close() throws SQLException {
//放回池子中
pool.add(oldConnection);
}

//4对于不需要改写的方法,调用原有的方法。(底下都是)
@Override
public <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;
}

@Override
public void close() throws SQLException {
oldConnection.close();

}


@Override
public <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;
}

//只需要重写你想要的方法
@Override
public 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.Driver
url=jdbc:mysql:///db3
username=root
password=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);
}
}

文章转载自敲代码的人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论