1.数据库连接池简介 以及 实现例子

数据库连接池简介

什么是数据库连接池

当系统使用 JDBC 技术访问数据库时会创建一个 connection 对象,而该对象的创建过程是非常消耗资源的,并且创建对象的时间也比较长,假设系统一天有 1 万次的访问量,那么一天就会创建 1 万 connection 对象,这极大的浪费数据库的资源,而且可能造成数据库服务器内存溢出、宕机
为了解决上面的问题,就引入了数据库连接池(Connection pooling),它主要用来分配、管理、释放数据库的连接。数据库连接池首先会创建若干(该数量可以配置)个 connection 对象并将这些对象放入到池中,当系统需要使用 connection 对象时,数据库连接池会从池中分配一个事先创建好的 connection 对象给系统,当系统使用完毕或超时后,数据库连接池会将该 connection 对象重新放入到池中。这样就减少了创建 connection 对象所耗费的资源和时间,可以提高对数据库操作的性能。

 

 

 

模拟编写一个数据库连接池

因为要用到数据库,所以需要将之前编写的 JDBC 相关的代码和 jar 包拷贝过来,创建一个 SimpleConnectionPool 类,里面需要实现下面三个功能:

  • 初始化一个数据库连接池并向里面添加 10 个数据库连接
  • 从连接池中获取连接
  • 当程序用完连接后,需要将该连接重新放入到连接池中

需要注意数据库连接池要保证线程安全【代码中解决】:

/**
* 数据库连接池示例 此处不能允许 只是一个示例!
*/
看代码:
import Util.DB;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collections;
import java.util.LinkedList;

public class SimpleConnectionPool {
/**
* 初始化一个数据库连接池并向里面添加 10 个数据库连接
* 从连接池中获取连接
* 当程序用完连接后,需要将该连接重新放入到连接池中
*/

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这里用LinkedList来存,因为增加删除效率快,但是他是不完全的,所以:
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果该对象不存在,该清单应“包装”使用Collections.synchronizedList方法。最好的做法是在创建时,防止意外的非同步访问列表
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">解决线程安全问题:</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> LinkedList&lt;Connection&gt; ConnPool = (LinkedList&lt;Connection&gt;) Collections.synchronizedList(<span style="color: rgba(0, 0, 255, 1)">new</span> LinkedList&lt;Connection&gt;<span style="color: rgba(0, 0, 0, 1)">());

</span><span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">往里放10个Connection</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = 0; i &lt; 10; i++<span style="color: rgba(0, 0, 0, 1)">) {
        </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            Connection conn </span>=<span style="color: rgba(0, 0, 0, 1)"> DB.GetConnection();
            ConnPool.add(conn);
        } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
            e.printStackTrace();
        }
    }

}

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> Connection GetConnection() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> Exception {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断池子还有没有连接</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span>(ConnPool.size() &gt; 0<span style="color: rgba(0, 0, 0, 1)">){
        </span><span style="color: rgba(0, 0, 255, 1)">return</span> ConnPool.removeFirst();  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">移除第一个并返回</span>
    }<span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
        </span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Exception("服务器繁忙,请稍后重试"<span style="color: rgba(0, 0, 0, 1)">);
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用完后直接丢进来</span>
<span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> release(Connection reConnection){
    ConnPool.addLast(reConnection);
}

}

 

DB:

package Util;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DB {
private static String url = "jdbc:mysql://localhost:3306/jdbc";
private static String dbUser = "root";
private static String dbPass = "root";

</span><span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
        Class.forName(</span>"com.mysql.jdbc.Driver"<span style="color: rgba(0, 0, 0, 1)">);
    } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
        e.printStackTrace();
    }
}



</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> Connection GetConnection() <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> SQLException {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> DriverManager.getConnection(url,dbUser,dbPass);
}

}

 

知道原理即可