文章目录

  • 目录
  • 系统设计
  • 系统实现
  • 源文件

目录

系统设计

数据库连接池技术的设计思想非常简单,先将数据库连接作为对象存储在一个Vector对象中,Vector 类可以实现可增长的对象“数组”。Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。这里主要包含使用的连接(nowConnections)和未使用的连接(freeConnections)两个Vector类创建的对象,创建Vector对象的方法如下:

public DBConnectionPool(Vectorconnections)
{
freeConnections = new Vector();
nowConnections = new Vector();
}

当外部程序向数据库申请建立连接后,系统会调用nowConnections.add( )方法,此时已用连接计数器加1,相应的,调用freeConnections.remove( )方法,此时空闲连接计数器减1,对于这样的引用计数法将会在后面的章节中具体描述。这样,不同的数据库访问请求就可以共享这些连接,并通过复用这些已经建立的数据库连接,克服传统开发模式对数据库操作的缺点。另外,采用超时判断(timeout)机制,等待应用程序对连接的释放或者调用Connection.close()方法主动释放连接,能极大地节省系统资源和用户等待时间。而实现连接池时,当应用程序调用Connection.close( )试图去关闭数据库连接时,这时需要有一个通告给连接池实现模块,通告对当前的数据库物理连接(DBConnectionPool 对象)进行重用。为了使连接池实现模块能得到这种“通告”,连接池实现模块必须实现ConnectionEventListener接口,而且同时需要注册成为DBConnectionPool对象的监听者。连接池实现模块接受到此通告后,不是真正意义上的物理关闭,而是将DBConnectionPool对象返回到池中进行重用。从上面的介绍,可以看出连接池技术的关键就是其自身的管理机制,结合连接池工作的基本原理,通过下图展现出一个连接池系统的总体设计框架。

1.1 连接池中的关键类设计
一个连接池应用的设计,需要几个关键部分作为支撑,其中最为重要的是DBConnectionPool类和DBConnectionManager类,他们对连接的建立、管理、释放起决定性作用。大体作用列举如下:

1、一个DBConnectionPool类,该类负责从连接池获取(或创建)连接、将连接返回给连接池、空闲连接的超时等待、系统关闭时释放所有资源并关闭所有连接。

2、一个DataSourceProviderServlet类,该类负责通过上下文环境读取配置文件后装载和注册JDBC驱动、数据库名等。

3、一个DBConnectionManager类,该类负责按预先指定的最大连接池数连初始化连接池、创建DBConnectionPool对象provider、当所有的连接客户退出后,关闭全部连接。

4、DBconfig.properties属性文件,该文件中包含了数据库驱动(DriverName)、数据库URL、数据库表空间名(User)、表空间密码(Password)、连接池最大连接数(maxConnections)。

5、即为应用程序对连接池中的连接的调用和释放,应用程序退出后连接池的关闭。

将以上5个部分串连起来,即是本连接池的简单设计流程。首先应用程序向连接池申请连接,就需要通过DBConnectionPool类、DBConnectionManager类对连接池初始化,并且还需要DataSourceProviderServlet类的帮助读取DBconfig.properties文件中的属性,加载和注册JDBC驱动、数据库名等,连接池才能初始化成功。之后通过DBConnectionPool类监视、管理应用程序调用、释放的数据库连接,并通过该类的cp对象将连接使用情况反映在页面上。连接池管理程序得到某个连接,而其他线程就不会得到这个数据库连接了,此线程使用结束后,该线程将连接交还给连接池管理程序,以分配给其他等待连接的请求线程。这里连接池充分利用Java的线程同步机理,使当前服务线程处于等待状态,直至有空闲的连接出现。最后当应用程序退出时,通过DBConnectionManager类负责连接池的关闭。

1.2 连接池中的管理机制
应用程序开发中“三分技术、七分管理”的思想在连接池的配置中同样得以体现,如何从连接池中取得连接,何时释放连接、如何释放连接等问题还需要为连接池配置更为复杂的管理机制,连接池流程的管理如下图所示,这些属性定义了连接池与其中每个连接的有效状态值。连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。

系统实现

1.1 连接池的建立
应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等,通过读取连接属性文件DBconfig.properties与数据库实例建立连接。(该属性文件中包含了连接数据库的URL、数据库驱动、数据库表空间、数据库表空间密码、连接池最大连接数)在系统初始化时,根据相应的配置创建连接并放置在连接池中,这些对象作为系统可分配的自由连接,以后所使用的连接都是从连接池中获得,这样就避免了随意建立连接,关闭连接所带来的资源浪费。

连接池初始化如下:

publicDBConnectionPool(Vector connections)
{
FreeConnections = new Vector();
nowConnections = new Vector();
freeConnections = connections;
maxConnections =freeConnections.size();
}
本连接池的建立使用输入流,通过上下文环境,读取配置文件(Dbconfig.Prooperties)里预先设置的参数,部分代码如下:
public voidcontextInitialized(ServletContextEvent event)
{
Properties ps = new Properties();
Vector connections = new Vector();
ServletContext context =event.getServletContext();
try
{
//使用输入流,读取配置文件里的各种参数
InputStreaminput = getClass().getResourceAsStream("/DBconfig.properties");
ps.load(input);
input.close();
url = (String)ps.get(“url”);
user = (String)ps.get(“user”);
passWord = (String)ps.get(“passWord”);
DriverName = (String)ps.get(“DriverName”);
maxConnections=Integer.parseInt(((String)ps.get(“maxConnections”)).trim(), 10);
System.out.println(user);
//循环加入取得的连接到Vector中
for (int i = 0; i <maxConnections; i++)
{
//调用下面的方法,取得数据库连接,并放入到Vector中
connections.add(getConnection(url,user,passWord,DriverName));
}
}
catch (Exception e)
{
e.printStackTrace();
}
//放到服务器的上下文环境中
context.setAttribute(“CONNECTOR”,new DBConnectionPool(connections));
}

连接池初始化参数通过页面设置写入DBconfig.properties文件中,如下图所示:
1.1 连接池的管理
连接池管理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行管理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配、释放策略。

连接池的分配、释放策略对于有效复用连接非常重要。就一般情况而言,当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就删除该连接,并判断当前连接池内总的连接数是否小于minConn(最小连接数),若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。我们采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是:

publicsynchronized Connection getConnection(int TimeOut)
{
Connection con = null;
if (freeConnections.size() <= 0)
{
System.out.println(“连接失败,由于数据库连接池中无可用连接!请等待!”);
try {
newDBConnectionManager().closeAll();
}
catch (Exception ex)
{
ex.printStackTrace();
}
return con;
}
else
{
Connection temp = (Connection)freeConnections.firstElement();
freeConnections.remove(temp);
nowConnections.add(temp);
return temp;
}
}

当应用程序向数据库发起连接请求时,会检查连接池中是否存在空闲的连接。如果存在空闲的连接,连接池则把空闲连接分配给客户,并将该连接做相应处理,即标记为正在使用的连接,并将引用计数加1。如果不存在空闲连接,则检查连接池里的连接数是否已经达到了最大连接数(maxConn),若没有达到就为应用程序创建一个新的连接;若达到了最大连接数,那么就需要等待连接的释放,等待连接的释放时间是由系统中预先定义好的一个超时参数(Timeout)来做判断。如果在超时等待(TimeOut)后仍没有可用的空间连接,程序上便会返回一个null值,同时抛出无空闲连接的异常给用户。

publicvoid TimeOut(int TimeOut, Connection con)
{
try {
Thread t = new Thread();
t.start();
t.run();
t.wait(TimeOut);
closeConnection(con);
t.destroy();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
已用连接计数器的问题交由JSP页面中的循环来处理,每当应用程序申请一个连接时,计数器便会循环一次,部分实现代码如下:
for(int i = 0; i < cp.getNowConnections().size(); i++)
{
out.println("<fontcolor=blue>连接名称" + (i + 1) + “:”+ cp.getNowConnections().get(i) + “
”);
con =(Connection)cp.getNowConnections().get(0);
}
对于未用连接的处理与已用连接类似,部分实现代码如下:
for(int j = 0; j < cp.getFreeConnections().size(); j++)
{
out.println("<fontcolor=blue>未用连接名称" + (j + 1) + “:”+ cp.getFreeConnections().get(j) + “
”);
}

连接池的调用如下图所示,若连接已分配完毕,系统提示等待连接释放

源文件

【毕业设计】JSP数据库连接池的研究与实现(源代码+论文)相关推荐

  1. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  2. JSP学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)

    cc学院 毕业设计(论文)开题报告 题 目: 基于JSP的学生学籍管理系统 学 科 部: 信工学科部 专 业: 计算机科学与技术 班 级: 学 号: 姓 名: 指导教师: 填表日期: 20 年 月 日 ...

  3. 【毕业设计】基于JAVA的sprinmgboot实习管理系统(源代码+论文)

    这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的理念缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的各类系统很难达到老师的要求. 为了大家能够顺利并以最少的精力通 ...

  4. 【免费毕设】JSP旅游网站建设设计与实现(源代码+论文)

    文章目录 目录 一.系统设计 二.系统实现 源文件 目录 一.系统设计 4.1 系统功能设计 4.1.1网站结构功能 通过对旅游网站的用户需求分析,得出了五十里旅游网站前台的功能,共有旅行社介绍.旅游 ...

  5. JSP旅游网站建设设计与实现(源代码+论文)

    现代社会是信息社会.随着计算机网络技术.数据库技术.管理技术的发展,对信息的处理和利用已经深入到人类生活的各个方面.旅游是人们生活不可分割的组成部分,旅游业已成为当今世界上发展势头最强劲的产业,它是集 ...

  6. 【毕业设计】基于JAVA银行帐目管理系统(源代码+论文)

    这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的理念缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的各类系统很难达到老师的要求. 为了大家能够顺利并以最少的精力通 ...

  7. 【毕业设计】PHP课程网站络管理系统(源代码+论文)

    文章目录 目录 系统设计 系统实现 源文件 目录 系统设计 管理系统是根据课程网站的需求而设计和实现的,主要 用于实现课程系统办公人员对其办公系统内所有公务员进行管理,实现对员工信息的查询.录入.修改 ...

  8. 【毕业设计】PHP公共课平时成绩查询系统(源代码+论文+答辩PPT)

    文章目录 目录 一.系统设计 二.系统实现 源文件 目录 一.系统设计 在确定了软件需求和进行可行性研究之后,就进入了开发阶段.系统的主要功能与性能指标有了明确的标准,下面详细介绍总体设计的内容. 3 ...

  9. 【毕业设计】JAVA文件压缩与解压缩实践(源代码+论文)

    文章目录 目录 一.系统设计 二.系统实现 源文件 目录 一.系统设计 系统总体结构设计是系统设计过程中及其重要的一步,对系统的技术层次,开发过程,功能实现及开发成本方面具有重大的影响.系统总统结构设 ...

最新文章

  1. linux centos php5.3 安装curl扩展
  2. arcgis for android 学习 - (4) 了解mapView的一些方法和事件
  3. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
  4. 50句看后可以变换心情豁然开朗的话
  5. 如何获得所有CSDN勋章的获取方式?
  6. 1-物联网开发标配方案(预期方案使用说明和演示)
  7. 蔚来将推第三款SUV 续航超500km 明年有望交付
  8. 从gb2py.idx中获取一个汉字的拼音首字母
  9. SQL数据库备份还原命令
  10. E20170816-mk
  11. 移动互联网浩荡十年 有的升腾,有的陨落
  12. java长连接_java如何实现http长连接
  13. ThreeJS - 动态更换fbx模型的某个子Mesh现有的纹理贴图为指定的纹理贴图
  14. python画图小例(玫瑰、佩奇、哆啦A梦、美队盾牌)
  15. 淘淘商城---8.7
  16. 判断文件是否是PE文件
  17. tplink支持Linux的无线网卡,解决tp-link usb无线网卡在ubuntu14.04下无法使用的一种方法...
  18. cocos2dx中的颜色混合
  19. 欢迎来到北工大换书网
  20. 阿里云视频直播 web前端[移动端] Aliplayer的简单案例

热门文章

  1. fedora 19 gnome 3.8 关闭笔记本盖子的动作
  2. Linux—计划任务管理
  3. 程序员专属段子集锦 3/10
  4. Golang 方法接收者为值与指针的区别
  5. CVTE 2016 春季实习校招一面(C++后台)
  6. dbeaver can't connect HBase1.2 using phoenix driver #1863
  7. WebDriver API
  8. Beta阶段冲刺第一天
  9. php - 微信 - 缓存access_token类。
  10. 对于over-posting的防御