重新拾起Java来学,就遇到了一本不错的书《Hibernate 深入浅出》电子工业出版社,相较其他的工具类书,本书中用词更加生动活泼,从字句之间就可以看出作者的用心与深厚的文字功底,让人相信,此书值得一看。

说道数据库,头脑中一下子就想到了经典的连接步骤,确实通过JDBC获取数据库连接是件再简单不多的事情,但对于JDBC Driver来说,连接数据库却并非一件轻松的差事,因为底层它还需要做很多其他事情,那么它还需要做些什么呢?

(1)数据库连接要在服务器与数据库服务器之间建立一个Socket Connection

(2)连接建立之后,应用服务器和数据库服务器之间还需要交换若干次数据(验证用户密码、权限等)

(3)然后,数据库开始初始化连接会话句柄,记录联机日志,为此连接分配相应的处理进程和系统资源。

系统如此忙碌,如果我们只是简单的扔过去两个SQL语句,然后就将此连接抛弃,是在可惜,而数据库技术正是为了解决这个问题。

外部使用者可以通过getConnection方法获取连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时连接并没有关闭,而是有连接池管理器回收,并为下一次使用做好准备。下面我们用代码简单模拟一个连接池,主要实现的功能有:

(1)getConnection方法获取数据库连接,如果当前池中有可用连接,则将池中最后一个返回,如果没有,则新建一个;

(2)releaseConnection方法将使用完毕的数据库放回备用池,判断当前池中连接是否已超过阈值,如果超过,则关闭该连接,否则放回池中以备下次使用。

好了,下面是模拟代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;public class DBConnectionPool implements ConnectionPool{private static Vector pool;private final int POOL_MAX_SIZE=20;/** 获取数据库连接* 如果当前池中有可用连接,则将池中最后一个返回,如果没有,则新建一个*/public synchronized Connection getConnection() throws BDException {if(pool == null){pool = new Vector();}Connection conn;if(pool.isEmpty()){conn=createConnction();} else {int last_idx = pool.size()-1;conn = (Connection) pool.get(last_idx);pool.remove(pool.get(last_idx));}return conn;}/** 将使用完毕的数据库放回备用池* 判断当前池中连接是否已超过阈值,如果超过,则关闭该连接;* 否则放回池中以备下次使用*/public synchronized void releaseConnection(Connection conn) {if(pool.size() > POOL_MAX_SIZE){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}else{pool.add(conn);}                }/** 读取数据库连接信息,并从数据库连接池中获取数据库连接*/private static Connection createConnction() throws BDException {Connection conn;try {Class.forName("oracle.jdbc.driver.OracleDriver");conn =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:oracle","personal","personal");return conn;} catch (ClassNotFoundException e) {throw new DBException{"ClassNotFoundException when loading JDBC Driver"};}catch(SQLException e){throw new DBException{"SQLException when loading JDBC Driver"};}}
}

当然这个是及其简单仍有很多bug 的模拟,但通过此模拟可以对连接池有一定的理解。

数据库连接池 Connection Pool 是什么,做什么相关推荐

  1. 连接池Connection Pool 单例设计

    连接池单例模式 1.私有化ComboPooledDataSource将其作为属性,使其实现单例 2.DataSourceFactory实现懒汉模式,这样作为属性的连接池cpds也就变为了单例 3.从连 ...

  2. 《ADO.NET 2.0高级程序设计》读书随笔(1)使用连接池connection pool

    转载于:https://www.cnblogs.com/xuxiaoguang/archive/2007/12/18/1004591.html

  3. .Net与Oracle地数据库连接池(Connection Pool)

    .Net与Oracle的数据库连接池(Connection Pool) 概述: 数据库连接池允许应用程序重用已存在于池中的数据库连接,以避免反复的建立新的数据库连接.这种技术能有效提高应用程序的伸缩性 ...

  4. c3p0 服务启动获取连接超时_JDBC数据库连接池

    连接池的本质是构建一个容器,容器是用来存创建好的线程,http连接.数据库连接.netty连接等 各个连接池的使用大致分为三个部分 1.首先是初始化连接池,根据设置相应的参数.连接池的大小.核心连接数 ...

  5. 数据库连接池 ( 二 ) 连接池概念

    2.连接池概念 2.1.普通模式开发,存在的问题: (1)普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证 ...

  6. 数据库连接池的实现及原理

    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况 ...

  7. 数据库连接池原理以及好处

    本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接池原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接池实现过程作为演示. 一.早期通过JDBC方式操作数据库 我们先来看早期使用 ...

  8. mysql连接池的原理_数据库连接池的实现及原理

    对于一个简单的数据库应用,由于对于数据库的访问不是很频繁.这时可以简单地在需要访问数据库时,就新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况 ...

  9. Druid 不仅仅是一个数据库连接池

    目前我已将现有项目中的数据库连接池全部更换为 Druid,下面我们看一下Druid相关内容. Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩 ...

最新文章

  1. mysql left join,right join,inner join用法分析
  2. Yii2掉index.php?r=
  3. 威廉与玛丽学院读计算机博士,威廉与玛丽学院计算机科学(计算运算研究)理学硕士研究生申请要求及申请材料要求清单...
  4. UVa 1025 A Spy in the Metro
  5. c语言课程设计怎么做,C语言课程设计————写下流程图! 谢谢
  6. 移动开发框架,第【一】弹:QuoJs 官方文档(汉化版)
  7. 2020蓝桥杯省赛---java---B---6(分类计数)
  8. 自然语言处理领域基本概念笔记
  9. static和extern对函数的作用
  10. 消费者启动,允许期间报task supervisor timed out 异常,解决
  11. CentOS 编译运行 DPDK 19.11 流程
  12. matlab 无法保存.m文件
  13. python判断生肖
  14. iOS逆向-微信自动添加好友
  15. PAT_乙级_1009_筱筱
  16. 让数码管比段生成器去见鬼吧
  17. GS108E+GS105E+TP-LINK TL-WDR5620实现联通家庭宽带IPTV单线复用教程
  18. android画板需求分析,基于Android的画板的设计与实现论文.doc
  19. 益聚星荣:靴子过万、口罩上千,加拿大鹅又是在收割“智商税”
  20. 每秒处理10万订单乐视集团支付架构

热门文章

  1. Python分析香港26281套在售二手房数据
  2. Google Earth Engine(GEE)——Landsat 8TI/TOA/SR影像对比分析区别和去云即NDVI计算
  3. 输入一个url到浏览器页面展示都经历了哪些过程
  4. android系统移植培训,Android系统之Recovery移植教程 【转】
  5. 威锋网金狮奖落下大幕,2017年度科技榜单出炉
  6. linux man 路径,Linux中.man文件用法【转】
  7. 消息称即刻搜索即将关闭
  8. 富友支付 统一下单接口 自创php版本demo
  9. 【OS 学习笔记】什么是同步、互斥?
  10. 利用定时器1实现流水灯