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<Connection> ConnPool = (LinkedList<Connection>) Collections.synchronizedList(<span style="color: rgba(0, 0, 255, 1)">new</span> LinkedList<Connection><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 < 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() > 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); }
}
知道原理即可