《2022年数据库连接池设计文档参考 .pdf》由会员分享,可在线阅读,更多相关《2022年数据库连接池设计文档参考 .pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、北京交通大学数据库连接池设计文档程序设计模式王子硕韩振宇秦占明2012/4/7 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 20 页 -数据库连接池设计文档1/19目录1.人员分工.22.系统概述.32.1.数据库连接池技术的基本原理.32.2.数据库连接池技术中的基本管理策略.33.系统设计.63.1.加载驱动与配置文件.83.2.建立数据库连接池.83.3.获取和释放数据库连接.93.4.管理数据库连接池.94.使用设计模式的系统实现.10 4.1.单例模式.10 4.2.简单工厂模式和工厂方法模式.12 4.3.命令模式.13 4.4.代理模式.15 4.5.外观模式.
2、17 5.程序测试.19 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 20 页 -数据库连接池设计文档2/191.人员分工韩振宇:整体系统设计。确定该连接池将使用外观模式,单例模式,代理模式,命令模式,工厂方法模式五种实际模式。并搭建连接池整体框架。外观模式和单例模式的实现,体现在PoolGenerator.java 中。代理模式的实现,即MyConnection.java 的实现。王子硕:命令模式的实现,即包com.bjtu.Commands 中类的具体实现。监控线程 ListenerThread.java 和测试用例mainFrame.java 代码的编写。秦占明:工厂方
3、法模式的实现,即包com.bjtu.Pool中的类DBFactory.java,AccessFactory.java,MySQLFactory.java,Pool.java,MySQLPool.java,AccessPool.java 的具体实现。properties 文件内容的设计,编写PoolConfig.java。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 20 页 -数据库连接池设计文档3/192.系统概述2.1.数据库连接池技术的基本原理数据库连接池的基本思想就是预先建立一些数据库连接,放置在一个资源池对象中以备使用。当应用中需要建立数据库连接时,只需从该资源池中取
4、一个来用而不用重新建一个连接。使用完毕后,只需将此连接放回到资源池中即可,而不用真正地断开连接。数据库连接的建立和断开都有资源池自身来管理,这个资源池就是数据库连接池。资源池是一个普遍的概念,和缓冲存储机制有相近的地方,都是缩减了访问的环节,但它更注重于资源的共享。数据库连接池技术就是应用资源池的思想来解决数据库连接问题的。2.2.数据库连接池技术中的基本管理策略数据库连接池技术中的基本管理策略包括建立策略、分配策略、释放策略、监控策略和配置策略。2.2.1.建立策略数据库连接池技术的建立策略一般为在初始化时建立连接池,并在连接池中预先生成一定数量的连接以备用,并启动数掘库连接池的监控器。建立
5、连接池建立连接池的时机有种:一种是饿汉式建立,另一种是懒汉式建立。饿汉式建立是指在应用或服务启动时就建立连接池,并预先生成一定数量的连接。懒汉式建立是指在应用或服务中在第一次用到连接池时才建立连接池。从资源利用效率角度来讲,饿汉式建立比懒汉式建立稍差些。从速度和反应时间角度来讲,饿汉式建立比懒汉式建立稍好些。为便于控制和管理,要对建立的连接池的实体个数进行控制。典型的做法是只建立和维护一个连接池的实体,并由数据库连接池管理部件进行控制和管理。预建立连接连接池建立后,为提高速度和反应时间,一般会预先建立一定数量连接放入到连接池中。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 20
6、 页 -数据库连接池设计文档4/19这样,当有请求数据库连接时,可迅速返回可用的数据库连接预先建立的连接数根据具体情况来进行设置。当数据库访问较少或数据库资源较为紧张时,预先建立的连接数应设置小一些;当数据库访问较多且数据库资源较宽松时,预先建立的连接数应设置大一些。启动监控器完成连接池建立并预建立一定数量的连接之后,应启动数据库连接池的监控器,使连接池处于预先设置的监控策略的监控之下,以保证连接池有效地运行。2.2.2.分配策略数据库连接池技术的分配策略一般为先从预先建立的连接中查找空闲连接,如无空闲连接且连接未达最大值则新建立一个连接,否则等待直到有可用连接为止连接池中预先建立的连接按是否
7、已被分配分别放到空闲聚集或占用聚集中。已分配未释放的连接放到占用聚集中,新建立或被释放的连接的放到空闲聚集中。分配策略的一般算法:(1)检查空闲聚集中是否有空闲连接,如有则将其从空闲聚集移到占用聚集并返回。否则执行下一条。(2)检查预先建立的连接数是否达到允许的最大值,如果没有达到,则新建立一个连接,放到占用聚集并返回。否则执行下一条。(3)等待直到收到有连接释放的通知,然后从(1)可始执行。2.2.3.释放策略数据库连接池技术的释放策略一般为将被释放的连接从占用聚集移到空闲聚集中,并向正在等待空闲连接的请求者发出有连接释放的通知。在释放连接前,可以加入一些特定的处理,以使被释放的连接在被放入
8、空闲聚集之前被加工清理。1.2.4.监控策略数据库连接池技术的监控策略一般为触发检查、进行连接清理、保证最小连接数。监控策略。监控策略对连接池中的连接进行检查,对于过期、引用次数过多、连接中断的连接进名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 20 页 -数据库连接池设计文档5/19行清理,保证连接池中的连接的数量和质量。触发检查数据库连接池技术的监控触发检查方式般有以下几种:定时触发:每隔固定的时间间隔对连接池中的连接进行检查。这个固定的时间间隔一般通过配置文件来定义。即时触发:提供外部接口,由外部管理程序来不定时地触发对连接池的检查或报告当前的连接池状态。变化触发:当分配
9、、释放或使用连接池中的连接时触发对连接的检查。进行连接清理是指根据一定的要求将检查连接池中的连接,将不符合要求的连接从池中清理出去。进行连接清理的一般算法如下:(1)遍历连接池中的每一个连接,对于每个连接执行步骤(2)。(2)判断连接是否有效,如果无效则清除连接,然后转到步骤(6)。(3)判断连接是否空闲,如果不空闲则转到步骤(7)。(4)判断连接是否超出最大空闲时间,如果是转到步骤(8)。(5)判断连接是否超出最大引用次数,如果是转到步骤(8)。(6)如果还有未检查连接,则转到步骤(2),否则结束。(7)判断是否超出连接最大使用时间,如果超出转到步骤(8);否则转到步骤(6)(8)释放连接及
10、其占用的资源,并从池中清除此连接,然后转步骤(6)。名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 20 页 -数据库连接池设计文档6/193.系统设计该系统设计应具备以下特点:易于使用:对于原先使用JDBC连接的客户端不需要对原程序进行任何改动即可应用。其使用方式同使用JDBC的方式一样,客户端不需要了解该产品的任何内部细节。可扩展性强:支持多个不同的数据库,可满足客户端对多个不同的数据库的访问需求。运行效率高:通过调整管理策略,可以使其能在占用较少系统资源的情况下满足客户端对数据库连接的需求。易于维护:对数据库连接池的建立、使用、管理等活动中可变性进行封装,当对可变性进行修改
11、时,只需要修改,部分模块,使得系统易于维护复用性强:在数据库连接池基础上抽象出资源池,可复用资源池使之能支持其他的系统资源,如服务池、线程池等。用户加载驱动获取连接释放链接使用连接监控数据库连接池*数据库连接池系统的的用例图名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 20 页 -数据库连接池设计文档7/19系统类设计图名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 20 页 -数据库连接池设计文档8/193.1.加载驱动与配置文件由于对于每个数据库连接池发生器都要求有唯一实例,所以在得到数据库连接池产生器PoolGenerater 时要求使用单例模式。在此我们设
12、计了一个PoolConfig 类读入并存储在properties 内的配置信息。由 PoolGenerater 维护一个 PoolConfig 的实例,PoolGenerater 提供了从读取properties 文件,并对 PoolConfig 进行初始化的方法readConfig(),由于PoolGenerater 控制配置文件的读取(readConfig 方法),连接池的生成(createPool 方法),数据库驱动的加载(loadDriver 方法)等过程,因此也可视为外观模式(Fa?ade)。这里一旦调用createPool 方法,就会启动一个监控线程 ListenerThread,
13、用于对连接池进行定期检查。Properties 文件设计:dbName 数据库名称dbDriver 数据库驱动connectionURL 连接 URL dbUserName 用户名dbPassword 密码maxConnection 最大连接数minConnection 最小连接数longestUsedTime 连接最长使用时间longestFreeTime 连接最长空闲时间maxReferedTime 连接最大引用次数monitorTime 检测连接池间隔时间3.2.建立数据库连接池用了工厂方法模式:在包 com.bjtu.Pool 中:Pool 是抽象产品类,MySQLPool/Acces
14、sPool是具体产品。DBFactory 是抽象工厂,MySQLPool/AccessFactory是具体工厂。名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 20 页 -数据库连接池设计文档9/19工厂类根据读入属性内的字符串利用反射机制,生成相应的数据库管理类工厂,工厂再产生工厂管理类的实例。一旦连接池实例化成功,便需要预建立一些连接,预建立连接的数量在此我们去配置文件中的最大连接数与最小连接数的平均值。我们这里主要实现了MySQLPool,而这些工作都在MySQLPool的构造函数中完成。3.3.获取和释放数据库连接本系统对数据库用户实际使用透明,所以当用户请求一个连接时,
15、本数据库应当从池中返回一个实现了Java.sql.Connect 接口的连接。当用户释放连接时,并不真正释放链接,而是把这个连接放回连接池当中。这就需要使用代理模式。MyConnection实 现 了java.sql.Connect接 口,并 且 内 部 保 存 了 一 个 指 向 实 现 了java.sql.Connect 的引用。这样一来需要使用Connection 时,可以用MyConnection 代替,这就实现了静态代理模式。在这个连接池的实现中,我们只需要重写Connection 原有的 close方法,就可以达到目的。3.4.管理数据库连接池对于数据库连接池进行的操作部分采用了命
16、令模式,其中 Command 为抽象命令;New2BusyCommand/CloseCommand/New2FreeCommand/CreateCommand/OccupyCommand/DeleteCommand 为具体命令类,具体功能后面会进行详细解释;ComOperator 为调用者(Invoker);Pool 为接收者(Receiver)。对于监视数据库连接池,应采用观察者模式,当数据库连接池发生改变时,通知已注册的观察者(监视者)进行一些上述要求的特定操作(如清理连接,重启连接等)。名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 20 页 -数据库连接池设计文档10/
17、194.使用设计模式的系统实现4.1.单例模式模式定义:单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点,即自行实例化并向整个系统提供这个实例。按照常见的实际不同,单例模式可以分为饿汉式和懒汉式。饿汉式反应时间相对较快,而懒汉式的资源利用率相对较高。单例模式具体的实现方法有以下几个要点:A、构造函数私有,以防止用户自己创建。B、提供一个私有的静态成员变量。C、提供一个工友的静态工厂方法。模式优缺点:在本数据库连接池中使用了利用缓存来实现单例。每次操作的时候,先到内存里面找,看有没有这些数据,如果有,那么就直接使用,如果没有那么就获取它,并设置到缓存中,下一次
18、访问的时候就可以直接从内存中获取了。优点:节省大量的时间,提高系统的性能,防止用户创建多个实例。缺点:这是一种利用缓存空间换时间的方法,需要占用系统资源。模式具体分析:在本系统中com.bjtu.pool 包中,PoolGenerator.java 文件中类PoolGenerator使用了单例模式,也就是说,在这个数据库连接池中,只能之多存在一个实例,这名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 20 页 -数据库连接池设计文档11/19就不需要为每个用户都创建实例,能够为系统节省很大的资源。程序实现中,主要是通过HashMap 缓存类实例,在创建Generator实例的时
19、候,如果Map中已经存在,就直接返回结果,否则创建一个新的实例然后保存到Map 中用于下次应用。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 20 页 -数据库连接池设计文档12/194.2.简单工厂模式和工厂方法模式模式定义工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。模式优缺点工厂方法模式的优点:工厂可以自主决定创建何种产品对象,创建细节被隐藏到具体工厂内部添加产品时,只需增加新的产品类和相应的生产工厂,无需修改原有的产品和生产工厂。工厂方法模式的缺点:添加产品时,需增加新的产品类
20、和相应的生产工厂,因此系统会带来额外开销。模式具体分析在本系统中com.bjtu.pool 包中,PoolGenerator.java 文件中类PoolGenerator使用了工厂方法模式。在生成DBPool 具体的产品时是根据在配置文件中读取的驱动不同,使用反射机制生成对应的工厂类,再由工厂类调用createPool方法生成对应的产品类,具体的对应关系如下:Pool.java:抽象产品接口 (Product)MySQLPool.java:具体产品类(Concrete Product)MyAccessPool.java:具体产品类(Concrete Product)DBFactory.java
21、:抽象工厂接口(Creator)MySQLFactory.java:具体工厂类 (Conrete Creator)AccessFactory.java:具体工厂类 (Conrete Creator)PoolGenerator.java:Client端名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 20 页 -数据库连接池设计文档13/194.3.命令模式模式定义:命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发
22、送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。模式优缺点:命令模式的优点:降低系统的耦合度,新的命令可以很容易地加入到系统中,可以比较容易地设计一个命令队列和宏命令(组合命令)。可以方便地实现对请求的Undo和 Redo。命令模式的缺点:使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 20 页 -数据库连接池设计文
23、档14/19模式具体分析:1.命令(Command):声明执行操作的接口2.具体命令(Concrete Command):将一个接收者对象绑定于一个动作;调用接收者相应的操作,以实现Execute().命令的内容3.调用者(Invoker):传递命令的4.接收者(Receiver):知道如何实施与执行一个请求相关的操作,任何类都可以作为一个接收者(负责干具体活的)5.客户(Client):创建具体命令对象并设定它的接收者(发布命令的)在本数据库连接池系统中,包 com.bjtu.Commands 中主要使用了命令模式。与标准命令模式相对应,关系如下:命令(Command):Command.ja
24、va 调用者(Invoker):ConnOperator.java:具体命令(Concrete Command):CloseCommand.java:关闭连接,将一个连接由占用聚集移至空闲聚集。CreateCommand.java:创建一个新的连接,用于初始化连接池使连接的建立以及定时清理连接池后,连接数目小于最小连接数时,建立新的连接。DeleteCommand.java:删除一个连接,用于连接池的定时清理。New2BusyCommand.java:将新建立的连接加入到占用聚集中。New2FreeCommand.java:将新建立的连接加入到空闲聚集中。OccupyCommand.java:
25、将一个连接从空闲聚集移至占用聚集中。接受者(reciever):Pool(MySQLPool以及 AccessPool)。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 20 页 -数据库连接池设计文档15/194.4.代理模式定义代理模式(Proxy),给某一个对象提供一个代理,并由代理对象控制对原对象的引用。角色分配Subject:java.sql.Connection Realsubject:具体数据库JDBC返回的 Connection.Proxy:MyConnection 优缺点代理模式的优点1.代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。2.远
26、程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的计算性能与处理速度,可以快速响应并处理客户端请求。3.虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。4.保护代理可以控制对真实对象的使用权限代理模式的缺点1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 20 页 -数据库连接池设计文档16/192.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。在此处使用的意图数据库连接池的最基础的功能就是向客户端提供连接。
27、数据库连接池系统向客户端返回的连接是一个实现了Conntion 接口的类 MyConnection 如果把与数据库引擎建立的连接不经过任何包装就直接返回的,数据库连接池系统将无法为这些连接提供附加的功能,最直接的影响就是无法控制连接的关闭和释放,除非约定客户端不能调用连接的close 方法,而是调用数据库连接池系统额外提供的方法,这显然与 JDBC的标准接口不符。通过对 Connection进行包装,为Connection 提供了附加的功能,这样Connection 就可以被纳入到连接池的管理中来。在数据库连接池系统中,连接池向外提供的应是添加一些可被连接池进行管理的属性和方法后的连接。每种不
28、同的数据库系统都提供自己的实现了Connection 接口的数据库连接类,数据库连接池系统不可能通过继承的方式来扩展他们的功能。MyConnection:该类的一个构造器接收类型为java.sql.Connection 的参数,将一个具体的连接纳入自己的管理,从而可以为其附件额外的职责,完成对此连拉的代理,而该类也实现了Connection 接口,使得客户端可以象使用其他数据库系统提供的连接一样地使用数据库连接池系统提供的连接。由于其他数据库系统提供JDBC接口都要实现Connection 接口,从而MyConnection 可以支持所有的提供标准JDBC接口的数据库。客户端使用数据库连接池系
29、统所提供的连接与使用于其他的连接是一样的,客户端看不到对连接的代理。MytConnection 在将客户端使用连接的请求处理后委派给具体的数据库连接池管理操作来执行。当客户端调用MyConnection 的 close 方法,连接并不会被关闭,而是通过调用者把此操作的请求(此链接从数据库连接池的占用队列,移动到空闲队列)发送给命令模式中的receiver 角色 pool 进行操作。名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 20 页 -数据库连接池设计文档17/194.5.外观模式模式定义外观模式(Facade),外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系
30、统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。角色分配Client:创建并使用数据库连接池的用户。Fa?ade:PoolGenerator Subsystem:SQLPool,PoolConfig,Drivers 优缺点外观模式的优点1.对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。2.实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。3.降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之
31、间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 20 页 -数据库连接池设计文档18/194.只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。外观模式的缺点1.不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。2.在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。在此处使用的意图PoolGenerater 在 Pool 之外加一层
32、封装,易于功能扩展时增加其他类型的Pool。同时隐藏了 Pool 的细节。用户只要通过调用PoolGenerater 中的各个方法就可以使用本数据库连接池系统。PoolGenerater 整合了数据库驱动加载,配置文件读入,生成数据库连接池,获取连接等操作。名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 20 页 -数据库连接池设计文档19/195.程序测试Com.bjtu.view 中的 mainFrame 是一个简单的示例,需要在eclipse 中运行,运行后,每隔一段时间会进行检测和处理,并会在控制台输出连接池中连接池的相关信息。add a new connection按钮点击后会申请一个连接,也会在控制台输出连接池中连接池的相关信息。Remove a connection 按钮点击后会将占用聚集中的第一个连接释放,同样还是会在控制台输出连接池中连接池的相关信息。名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 20 页 -