拓展阅读
第一节 从零开始手写 mybatis(一)MVP 版本。
第二节 从零开始手写 mybatis(二)mybatis interceptor 插件机制详解
第三节 从零开始手写 mybatis(三)jdbc pool 从零实现数据库连接池
第四节 从零开始手写 mybatis(四)- mybatis 事务管理机制详解
连接池的作用
资源重用
由于数据库连接得到重用,避免了频仍创建、释放连接引起的大量性能开销。在减少系统斲丧的底子上,
另一方面也增长了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。
对于业务哀求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,使用数据库连接池技术。
设置某一应用最大可用数据库连接数,避免某一应用独占全部数据库资源。
同一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先设定的连接占用超时时间,强制收回被超时占用的连接。
从而避免了常规数据库连接操作中可能出现的资源泄漏(当程序存在缺陷时,申请的连接忘记关闭,这时间,就存在连接泄漏了)。
中间件
常见实现对比
参考网上资料Druid > TomcatJDBC > DBCP > C3P0,BoneCP 的性能方面没有深入比较,应该和 Tomcat Jdbc 差不多。
对于小型的系统,并发压力不大时,选择哪一种数据库连接池差别不会很大,主要考虑的应该是连接池的稳定性。
当并发量较高时,一般不会选择使用 DBCP 和C3P0,选 Druid 是较好的。
手动实现
自己实现一个简化版,便于理解原理。
- public interface IPool {
- /**
- * 获取新的数据库链接
- * @return 数据库链接
- */
- PoolConnection getPoolConnection();
- }
复制代码 其中 PoolConnection 如下:- public class PoolConnection {
- /**
- * 是否繁忙
- */
- private volatile boolean isBusy;
- /**
- * 数据库链接信息
- */
- private Connection connection;
- }
复制代码 [code]public class PoolImpl implements IPool { /** * 数据库驱动 */ private final String jdbcDriver; /** * 数据库连接 */ private final String jdbcUrl; /** * 数据库用户名 */ private final String username; /** * 数据库密码 */ private final String passowrd; /** * 连接池大小 */ private final int size; /** * 数据库连接池列表 */ private List poolConnections = new ArrayList(); public PoolImpl(String jdbcDriver, String jdbcUrl, String username, String passowrd, int size) { this.jdbcDriver = jdbcDriver; this.jdbcUrl = jdbcUrl; this.username = username; this.passowrd = passowrd; this.size = size; init(); } private void init() { try { //1. 注册数据库连接信息 Driver sqlDriver = (Driver) Class.forName(jdbcDriver).newInstance(); DriverManager.registerDriver(sqlDriver); //2. 初始化连接池 initConnectionPool(); } catch (InstantiationException | IllegalAccessException | SQLException | ClassNotFoundException e) { e.printStackTrace(); } } /** * 初始化链接 * @throws SQLException sql 非常 */ private void initConnectionPool() throws SQLException { for(int i = 0; i < size; i++) { Connection connection = DriverManager.getConnection(jdbcUrl, username, passowrd); PoolConnection poolConnection = new PoolConnection(false, connection); poolConnections.add(poolConnection); } } @Override public PoolConnection getPoolConnection() { if(poolConnections.size() |