关键字 |
数据库连接池、扩展 |
我的介绍。 |
“数据库”指的是数据本身和支持数据结构。数据库创建大量的信息输入,存储、检索和管理信息[1]。随着科技的进步,信息交换和保存了一个巨大的增长。JDBC提供了一个用于访问关系数据库的标准库。使用JDBC API,可以获得各种不同的SQL数据库完全相同的Java语法。有七个标准步骤查询数据库[2]:1。加载JDBC驱动程序2。3定义连接URL。4建立连接。创建一个声明对象5。 Execute a query or update 6. Process the results 7. Close the connection |
打开一个连接到一个数据库是一个耗时的过程。对于短的查询,它可以打开连接需要更长的时间比执行实际的数据库检索。因此,在应用程序重用连接对象反复连接到同一个数据库中。来了需要和连接池的概念的重要性。 |
“连接池”传播跨几个用户请求连接开销,从而节约资源为未来的请求。它可以提高应用程序的响应时间,需要连接,尤其是基于web的应用程序。但如果我们说小的用户数量,但足够大油门数据库服务器,然后我们需要找到解决方案。这是因为我们必须依赖供应商特定的用户,完成“单界面多使用”的Java应用程序的概念。同时,包用于实现连接池机制创建开销小缩放应用程序在内存中。 |
二世。相关工作 |
连接池技术的基本思想是pre-establish一些连接对象并将其保存在内存使用,当需要建立数据库连接程序只采取一个使用从内存中没有新的,使用后只需要替换它们在内存中,建立和断开的链接都是由连接池管理本身[3]。一个连接池类应该能够执行以下任务: |
1。Preallocate连接:提前分配更多的连接速度东西如果会有许多并发请求,但引起初始延误。 |
2。管理可用连接:如果需要连接和一个空闲连接可用,把它放在忙连接的列表,然后返回它。 |
3所示。分配新连接:如果连接是必需的,没有可用的空闲连接,然后连接限制没有达到,开始一个后台线程分配一个新的连接。然后,等待第一个可用的连接,是否新分配的。 |
4所示。等待连接可用:这种情况发生在没有空闲的连接,你达到的限制连接数。这个等待应该没有不断的轮询。 |
5。密切联系时要求:注意,连接关闭垃圾收集时,你不总是显式关闭它们。但是,你有时会想要更多的显式控制过程[2]。 |
集中的连接池的配置参数[3]包括: |
1。Min-Connections建立了连接池,即空闲连接保持动态连接池; |
2。最大连接在连接池; |
3所示。连接保持动态连接池中 |
最大连接= Min-Connections +连接; |
4所示。Wait-Connection-Times没有空闲连接; |
5。Connection-Use-Count; |
6。Wait-Release-Time。 |
c3p0包[4]是一个易于使用的库进行传统JDBC驱动程序“企业级”通过增加功能定义的jdbc3 jdbc2规范和可选的扩展。c3p0希望提供数据源实现多适合使用大容量“J2EE企业应用程序”。 |
“commons-dbcp”包由Apache依赖代码[5]commons-pool包中提供的底层对象池机制,它利用。DBCP 2是基于共享池2并提供性能增加,JMX支持以及许多其他新特性相比DBCP 1. x。 |
由Oracle数据库连接池居民(DRCP)[6]池“专用的”服务器。联合服务器相当于一个前台进程服务器和一个数据库会话的总和。DRCP补充中间层连接池中线程之间共享连接中间层的过程。此外,DRCP使共享数据库连接的中间层流程相同的中间层主机上,甚至在中间层主机。 |
Java命名和目录接口(JNDI)是一个Java API[7]一个目录服务,允许Java软件客户发现和查找数据和对象通过一个名字。像所有的Java api接口与主机系统,JNDI是独立于底层实现。此外,它指定了一个服务提供程序接口(SPI),允许插入目录服务实现框架。它可能使用一个服务器,一个平面文件,或一个数据库;选择供应商。 |
JNDI JDBC: JDBC java数据库API,而JNDI是java命名和目录接口API。在这里最主要的是,你实际上在JNDI目录中存储一个JDBC数据源,所以,你只是使用JDBC和获得一个连接通过JNDI查找[8]。简而言之词:JDBC数据库域,JNDI可以让你在一个虚拟存储对象上下文(目录),可以是本地,远程(实现细节通常不重要)。 |
数据来源:JDBC 2.0扩展API数据源的概念,介绍了标准,通常对象指定数据库或其他资源的使用。数据源可以被绑定到Java命名和目录接口(JNDI)实体,这样您就可以访问数据库的逻辑名称,为了方便和可移植性[9]。 |
由IBM DB2 (R)连接企业版服务器通常为成千上万的同步客户机请求提供数据库连接。在DB2 Connect版本6,后来连接池默认激活[10]。 |
当DB2 Connect实例开始创建一个群协调代理。 |
步骤1:当一个连接请求代理分配给此请求。代理将连接到DB2服务器,并将在DB2中创建一个线程。 |
步骤2:当应用程序发出断开请求,代理不会将这个请求并传递到DB2服务器。相反,代理放回池中。代理池中仍然拥有其连接到DB2服务器和相应的DB2线程。 |
步骤3:当另一个应用程序发送一个连接请求,该代理分配给这个新应用程序。确保安全操作,用户身份信息被传递到DB2线程反过来执行用户身份验证。 |
第四步:当一个应用程序请求从主机断开,DB2 Connect滴入站连接的应用程序,但会让出站连接到主机在一个池中。 |
提供的连接池OCI司机Oracle9i[9]允许应用程序有许多逻辑连接,所有使用少量的物理连接。每次调用这个逻辑连接将路由可用的物理连接。基于将通话时长是一个更加可伸缩连接池的连接池的解决方案。 |
三世。算法 |
一个。设计注意事项: |
吗?前端(编程env。): Java 5 (jdk1.5和jre 1.5)或以上 |
吗?IDE: Eclipse IDE Java EE Web开发人员;朱诺服务版本2 |
吗?后端(数据库):MySQL 6.0 |
吗?应用程序服务器:JBoss 5.0(这是建立在Apache Tomcat) |
B。该算法的描述: |
我们将使用简单的数据结构提供了Java 5和并发应用程序开始。 |
1。实施:的一个重要界面,我们在这个框架是实施接口。它仅仅是一个对象,执行可运行的任务。它将任务提交从如何执行一项任务的细节。 |
2。ConcurrentLinkedQueue基于链接节点:一个无界的线程安全队列。这个队列订单元素FIFO(先进先出)。这是一个合适的选择,许多线程将共享共用一个集合。 |
3所示。ScheduledExecutorService:是一个ExecutorService可以计划任务运行过一段时间后或执行多次与一个固定的间隔时间之间执行。任务由一个工作者线程上异步执行,而不是线程将任务交给ScheduledExecutorService。 |
我们正在使用的基本参数来处理连接池操作: |
1。MIN_IDLE:最小数量的空闲池中连接对象出现 |
2。MAX_CON:最大数量的连接对象池系统。这包括闲置以及活跃的连接。 |
3所示。WAIT_TIME:时间间隔在一个单独的线程,检查满足这两个约束。 |
我们使用2队列实现池集体: |
(我)空闲队列:也就是但闲置的连接对象。空闲的连接是没有参与任何交易,可用。 |
(二)活动队列:将持有和活跃的连接对象。活跃在这里意味着连接忙于一些事务。 |
1。PoolCreation:一个方法用于初始化池MIN_IDLE MAX_CON对象的对象数量和维护系统的队列 |
2。BorrowObject:这种方法用于从池中分配对象的连接要求。 |
3所示。ReturnObject:这个方法是用来返回对象池,自找的。 |
4所示。CreateObject:这是其中一个重要的方法,实际上做的工作连接对象创建和建立数据库连接。 |
全局变量:POOLSIZE = no。的对象在闲置+不。在活跃的对象 |
四、伪代码 |
算法1 PoolCreation (MIN_IDLE MAX_CON WAIT_TIME): |
(1)(a)初始化与MIN_IDLE空闲队列连接对象的数量。使用CreateObject方法创建一个连接对象,使其生活和准备使用。 |
(b) POOLSIZE - = MIN_IDLE |
(2)池的初始化、调度的并行线程将继续检查每WAIT_TIME秒的对象数。 |
如果(POOLSIZE > MAX_CON) |
而(闲置> 0) |
从空闲(i)删除对象 |
(2)减少POOLSIZE作为一个原子操作 |
算法2:BorrowObject: |
(1)如果(空闲队列是空的,POOLSIZE < MAX_CON) |
(我)通过CreateObject方法创建一个连接对象 |
(2)增加POOLSIZE作为一个原子操作。 |
(2)如果(闲置不空) |
(我)从空闲队列中删除一个对象和存储在一个变量中。 |
(3)添加对象(在步骤1中创建或借用步骤2)活动队列。 |
(4)返回的对象。 |
算法3:ReturnObject (OBJ): |
(1)删除的特定连接对象OBJ活跃 |
(2)添加这个对象OBJ,闲置 |
诉仿真结果 |
一个测试计划定义和提供的布局和测试。它可以被视为一个容器运行测试(测试用例)。考虑我们的应用,网上购物门户,我们认为是最复杂的测试用例来测试我们的机制即“注册用户”?浏览网站吗?使购买?检查出来?终于完成了。这火灾新鲜查询为每个用户每一步。所以这个测试用例生成最密集的SQL查询,因此在并发环境中最密集的要求的数据库连接。我们考虑的负载测试执行测试用例通过广泛和免费开源的负载测试工具“JMeter”。3版本的测试用例是测试一个更好的比较: |
1。非池版本(WOCP,没有连接池),使用传统方法的数据库连接。 |
2。JNDI版本(WJNDI, JNDI),与使用JNDI连接池,一个最简单的机制在大规模池。 |
3所示。混合版本的应用程序,我们的机制集成到应用程序中。 |
测试脚本记录元素是用于创建测试脚本和测试用例运行在不同的载荷如表1中所示 |
通过计算各自的比率“WOCP池”和“WJNDI池”的吞吐量,我们来到下面的结果 |
池/ WOCP = 1.178(大约)?汇集= 1.178 X WOCP ?~ 18%性能增加 |
(吞吐量)要在没有缓冲的、生命期的环境 |
池/ WJNDI = 1.041(大约)?汇集= 1.041 X WJNDI ?~ 4%性能增加 |
在JNDI(吞吐量)机制 |
这种方法扩展应用程序和实现数据库连接池不仅对于较小的应用程序执行速度更快,而且维护简单的两层架构的应用程序架构。一级二级时被应用程序的客户端是服务器端(包括应用服务器和数据库服务器)。虽然可用简单的方法我们使用的池,JNDI命名与连接池,把应用程序分为3层结构。一级客户,二级是应用程序服务器和3级数据库服务器,隐藏在应用程序服务器的JNDI命名。 |
六。结论和未来的工作 |
结果表明,该算法与整体性能以及更好地执行架构的好处。JNDI把应用程序分为3层架构而我们提出了系统维护应用程序的一个简单的两层的架构。它有一个小范围的改进,它不包括等待时间请求线程池是否完全占领,没有余地进一步添加新连接对象。这可以被认为是本文工作的未来的工作。 |
|
表乍一看 |
|
|
表1 |
表2 |
|
|
数据乍一看 |
|
图1 |
|
|
引用 |
- 维基百科,免费的百科全书,可用:http://en.wikipedia.org/wiki/Database
- http://pdf.coreservlets.com/first-edition/CSAJSP-Chapter18.pdf
- 郭良齐冯,就杨”,新方法在提高数据库连接池模型”国际期刊和信息工程,1卷,发行2007
- http://www.mchange.com/项目/ c3p0 /
- Apache Tomcat项目;http://commons.apache.org/proper/commons-dbcp/
- Krishna Mohan Itikarlapalli SreekumarSeshadri,凯文•奈尔LuxiChidambaran, AmoghavarshaRamappa, SrinathKrishnaswamy, Santanu达塔,甲骨文公司,世界总部,“数据库连接池(DRCP)居民,Oracle数据库11 g”,技术白皮书,2007年9月
- 维基百科,Availablehttp: / /en.wikipedia.org/wiki/Java_Naming_and_Directory_Interface
- http://stackoverflow.com/questions/15676990/difference-of-connection-pool-jdbc-and-jndi
- 甲骨文文档,可用:http://docs.oracle.com/cd/B10501_01/java.920/a96654/connpoca.htm
- IBM文档:http://www01.ibm.com/support/knowledgecenter/SSEPGG_8.2.0/com.ibm.db2.udb.doc/conn/c0006170.htm?lang=en
|