`
天空之城
  • 浏览: 402732 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

连接池参数测试结果分析

    博客分类:
  • Java
 
阅读更多
连接池属性测试
1.initialSize 属性
initialSize属性是在tomcat6.0后,连接池添加的属性,它是定义服务器启动初始化几个连接,默认情况下是0即服务器启动时不初始化连接。
2.maxActive 属性
表示并发情况下最大可从连接池中获取的连接数。如果数据库不是单独,供一个应用使用,通过设置maxActive参数可以避免某个应用无限制的获取连接对其他应用造成影响,如果一个数据库只是用来支持一个应用那么maxActive理论上可以设置成该数据库可以支撑的最大连接数。maxActive只是表示通过连接池可以并发的获取的最大连接数。
3.maxIdle 属性(maxActive=5,maxIdle=3)
如果在并发时达到了maxActive=5,那么连接池就必须从数据库中获取5个连接来供应用程序使用,当应用程序关闭连接后,由于maxIdle=3,因此并不是所有的连接都会归还给数据库,将会有3个连接保持在连接池种中,状态为空闲,以便下次使用时重复利用,这也是连接池真正发挥作用的地方。
4.minIdle 属性
最小默认情况下并不生效,它的含义是当连接池中的连接少于minIdle,系统监控线程将启动补充功能,一般情况下不启动补充线程。
5.testOnBorrow="true" 和 validationQuery="select 1" 的属性设置
我们知道数据库连接从本质上架构在tcp/ip连接之上,一般情况下web服务器与数据库服务器都不在同一台物理机器上,而是通过网络进行连接,那么当建立数据库连接池的机器与数据库服务器自己出现网络异常时,保持在连接池中的连接将失效,不能够在次使用,传统的情况下只能通过重新启动,再次建立连接,通过设置以上两个参数,但应用程序从连接池中获取连接时,会首先进行活动性检测,当获取的连接是活动的时候才会给应用程序使用,如果连接失效,连接将释放该连接。validationQuery是一条测试语句,没有实际意义,现实中,一般用一条最为简单的查询语句充当。
6.removeAbandoned、removeAbandonedTimeout 和 logAbandoned 属性设置
有时粗心的程序编写者在从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到maxActive直至连接池无法提供服务。现代连接池一般提供一种“智能”的检查,但设置了removeAbandoned="true"时,当连接池连接数到达(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时便会启动连接回收,那种活动时间超过removeAbandonedTimeout="60"的连接将会被回收,同时如果logAbandoned="true"设置为true,程序在回收连接的同时会打印日志。
removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启,生产环境中连接的关闭应该靠程序自己保证。

7.Tomcat dbcp数据库连接池,在tomcat部署多个应用时,在什么情况下连接池共享,什么情况下连接池不共享?
答:把连接池配置的resource放到context中连接池针对于每个应用独立,就是说tomcat在启动时,会针对每个应用建立配置的所有连接池,有几个应用,同一个连接池就会有几个。
如果配置连接池的resource放到全局resources里即GlobalNamingResources中,连接池是共享的。就是整个tomcat无论配置多少应用,整个tomcat在启动时,针对每个配置的连接池,只会生成一个,而且每个项目共享这个连接池。修改后的xml如下:
(GlobalNamingResources  在server.xml中)
<GlobalNamingResources> 
     <Resource name="UserDatabase" auth="Container" 
       type="org.apache.catalina.UserDatabase" 
description="User database that can be updated and saved"              factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
       pathname="conf/tomcat-users.xml" /> 
<Resource name="jdbc/test" auth="Container" 
type="javax.sql.DataSource" 
driverClassName="com.mysql.jdbc.Driver" 
url="jdbc:mysql://localhost:3306/test" username="root" 
password="root" maxActive="20" maxIdle="10" maxWait="1000" initialSize="10"/> 
  </GlobalNamingResources> 
 
以前是在context.xml的<context></context>标签中。具体如下:
<context> 
<Resource name="jdbc/test" auth="Container" 
type="javax.sql.DataSource" 
driverClassName="com.mysql.jdbc.Driver" 
url="jdbc:mysql://localhost:3306/test" username="root" 
password="root" maxActive="20" maxIdle="10" maxWait="1000" initialSize="10"/> 
 </context> 
 

但是在设置全局连接池时,必须在context.xml 的context中进行引用,代码如下:

<context> 
<ResourceLink name="jdbc/test" global="jdbc/test" type="javax.sql.DataSource"/> 
</context> 
 
8.连接池里的连接,是以堆栈类型的数据结构存储还是以队列类型的数据结构存储?
答:连接池里的连接是以堆栈的形成存储的,因为经过测试,先关闭返回的连接,是后被使用的,而后关闭返回的连接先被使用,符合堆栈的先进后出的原则。
测试的Connection对象的的地址顺序,如下:
a)获得一个连接,打印Connection对象地址,关闭连接,再获得下一个,我们会发现取的是个连接都是同一个。
代码:
 
for(int i=0; i<10; i++){ 
Connection conn = dataSource.getConnection(); 
System.out.println(i+": "+conn.getClass().getName()+"@"+   Integer.toHexString(conn.hashCode())); 
conn.close(); 
} 
 

结果:
0: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
1: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
2: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
3: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
4: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
5: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
6: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
7: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
8: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
9: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@164b9b6 
 
b)循环获得十个连接,将每个连接放到List集合cons里,不关闭释放这十个连接,先打印Connection对象地址。然后根据刚才放到cons里的顺序,逐个关闭设防连接,关完之后,再从连接池中获取十个连接不关闭释放,按照获取顺序,打印每一个Connection对象的地址,我们会发现,先释放的Connection对象,后没获得。
代码:
ArrayList<Connection> cons = new ArrayList<Connection>(); 
for(int i=0; i<10; i++){ 
Connection conn = dataSource.getConnection(); 
cons.add(conn); 
System.out.println(i+":"+conn.getClass().getName() 
+"@"+Integer.toHexString(conn.hashCode())); 

} 
for(int i=0; i<cons.size(); i++){ 
cons.get(i).close(); 
} 
for(int i=0; i<10; i++){ 
Connection conn = dataSource.getConnection(); 
cons.add(conn); System.out.println(i+":"+conn.getClass().getName() 
+"@"+Integer.toHexString(conn.hashCode())); 
} 
 

结果: 
0: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@1bfbfb8 
1: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@1c3e9ba 
2: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@125d61e 
3: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@10c6cfc 
4: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@c72243 
5: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@19a8416 
6: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@155d3a3 
7: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@1b994de 
8: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@dc9766 
9: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@57e787 
0: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@57e787 
1: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@dc9766 
2: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@1b994de 
3: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@155d3a3 
4: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@19a8416 
5: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@c72243 
6: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@10c6cfc 
7: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@125d61e 
8: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@1c3e9ba 
9: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper@1bfbfb8 

  
分享到:
评论

相关推荐

    WebSphere参数讲解-连接池方面

    ### WebSphere连接池参数详解 在企业级应用服务器领域中,IBM WebSphere Application Server(简称WebSphere或WAS)是一款非常流行的解决方案。其中,连接池技术是提高数据库访问效率的关键技术之一。本文将深入...

    连接池实现原理及效率测试

    《连接池实现原理及效率测试》 连接池是数据库应用中的一个重要概念,它在系统设计中扮演着提高性能、优化...在实际开发中,我们需要根据项目需求,合理配置连接池参数,选择高效的连接池实现,以实现最佳的系统性能。

    weblogic连接池配置数据库断掉重连的问题

    Weblogic 连接池配置数据库断掉重连的问题是一个非常重要的问题,需要进行详细的讨论和分析。在这个主题中,我们讨论了连接池配置的基本概念、断掉重连机制的原理、配置参数的解释等。通过了解这些知识点,我们可以...

    sqlserver连接池及测试程序

    在TestSQL这个文件中,可能包含了用于执行这些测试的代码和脚本,例如创建数据库连接、执行SQL语句、释放连接等操作,同时也可能记录了测试结果和分析报告。 总之,"sqlserver连接池及测试程序"这一主题涵盖了...

    RabbitMQ客户端连接池的原理及源码

    同时,结合功能测试和性能测试,我们可以验证连接池的效果,确保在提高性能的同时,不会引入新的问题。 总的来说,RabbitMQ客户端连接池的使用是提升系统效率的关键,理解和掌握其工作原理和源码,有助于我们更好地...

    JMeter测试有无数据库连接池的性能

    - 优化可能涉及调整数据库连接池参数,如最大连接数、最小连接数、超时设置等,以达到最佳性能和资源利用。 综上所述,"JMeter测试有无数据库连接池的性能"这个话题探讨的是如何利用JMeter这一工具来衡量数据库...

    mysql连接池java源码

    MySQL连接池在Java应用开发中扮演着至关重要的角色...总的来说,这个项目提供了一个学习和研究数据库连接池实现的绝佳机会,通过分析和实践,开发者可以更好地掌握数据库连接管理的技巧,提高Java应用的性能和稳定性。

    数据库连接池驱动程序包

    数据库连接池是现代应用程序开发中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,从而提高系统...在使用过程中,正确配置连接池参数,合理设置连接数量,能有效提升应用的运行效率和资源利用率。

    数据库连接池资源包(c3p0 , dbcp,druid连接池)

    c3p0提供了完善的连接池管理和监控功能,如自动检测失效的连接并回收,支持连接测试。它具有较小的内存占用,适用于小型项目。配置相对简单,但相比其他连接池,其性能稍弱。 2. **DBCP**:Apache Commons DBCP是...

    连接池的基本工作原理

    - **配置与维护**:最小连接数和最大连接数是连接池的关键配置参数,它们决定了连接池的规模,影响系统启动速度和响应速度。此外,连接池还需要定期检查连接的有效性,确保提供健康的连接给应用程序。 4. **优化...

    JDBC数据库连接池实现原理

    5. **监控和管理**:连接池会自动管理这些连接,例如检测空闲连接的存活状态,定时回收过期连接,根据需要动态调整连接池的大小。 6. **关闭连接池**:在应用程序关闭时,需要释放所有资源,包括关闭连接池中的所有...

    数据库连接池驱动包_数据库连接池驱动包_

    数据库连接池是现代数据库应用程序中的重要组成部分,它有效地管理和优化了数据库连接的创建、分配和回收,...同时,为了保证数据库连接池的正常工作,还需要正确配置连接参数,如最大连接数、最小连接数、超时时间等。

    Delphi数据库连接池性能测试程序(完整版含源码)

    通过分析`Unit1.pas`和`AsyncCalls.pas`,我们可以看到程序如何创建和管理连接池,以及如何进行性能测试。例如,它可能会使用TDBXConnectionPool组件来创建连接池,并在多线程环境中并发执行SQL操作,以此来模拟高...

    java手写数据库连接池

    4. **测试类(TestConnectionPool)**:在这个例子中,测试类用于验证我们的数据库连接池是否正常工作。通过创建三个线程并发访问数据库,可以测试连接池在多线程环境下的性能和稳定性。每个线程会从连接池中获取...

    BIO Socket连接池

    同时,这也为我们提供了优化和定制网络通信的基础,比如调整连接池参数,实现更高效的并发模型等。 在实际开发中,我们还可以考虑使用NIO(非阻塞I/O)或AIO(异步I/O)模型来进一步提升性能,但这些都需要更复杂的...

    java数据库连接池源码及使用示例

    数据库连接池在Java应用中扮演着至关重要的角色,...通过分析源码并运行示例,你可以深入理解数据库连接池的实现细节,这将对提升Java应用的数据库性能有很大帮助。同时,这也是一次了解和比较不同连接池实现的好机会。

Global site tag (gtag.js) - Google Analytics