`

数据库连接池比较

阅读更多

现在常用的开源数据连接池主要有c3p0,dbcp 和proxool 三种,其中:
¨         hibernate 开发组推荐使用c3p0;
¨         spring 开发组推荐使用dbcp (dbcp 连接池有weblogic 连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect ,告诉连接被重置, 这个设置可以解决);
¨         hibernate in action 推荐使用c3p0 和proxool;
下面具体就每种连接池的调研结果进行说明:
1. Apache-DBCP
Ø BasicDataSource 相关的参数说明
• dataSource: 要连接的 datasource (通常我们不会定义在 server.xml)
• defaultAutoCommit: 对于事务是否 autoCommit, 默认值为 true
• defaultReadOnly: 对于数据库是否只能读取, 默认值为 false
• driverClassName: 连接数据库所用的 JDBC Driver Class,
• maxActive: 可以从对象池中取出的对象最大个数,为0 则表示没有限制,默认为8
• maxIdle: 最大等待连接中的数量,设 0 为没有限制(对象池中对象最大个数)
• minIdle :对象池中对象最小个数
• maxWait: 最大等待秒数, 单位为 ms, 超过时间会丟出错误信息
• password: 登陆数据库所用的密码
• url: 连接数据库的 URL
• username: 登陆数据库所用的帐号
• validationQuery: 验证连接是否成功, SQL SELECT 指令至少要返回一行
• removeAbandoned: 是否自我中断, 默认是 false
• removeAbandonedTimeout: 几秒后会自我中断, removeAbandoned 必须为 true
• logAbandoned: 是否记录中断事件, 默认为 false
• minEvictableIdleTimeMillis :大于0 ,进行连接空闲时间判断,或为0 ,对空闲的连接不进行验证;默认30 分钟
• timeBetweenEvictionRunsMillis :失效检查线程运行时间间隔,如果小于等于0 ,不会启动检查线程,默认-1
• testOnBorrow :取得对象时是否进行验证,检查对象是否有效,默认为false
• testOnReturn :返回对象时是否进行验证,检查对象是否有效,默认为false
• testWhileIdle :空闲时是否进行验证,检查对象是否有效,默认为false
Ø 在使用DBCP 的时候,如果使用默认值,则数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际上就会是无效的数据库连接。因此为了防止获得的数据库连接失效,在使用的时候最好保证:
• username: 登陆数据库所用的帐号
• validationQuery :SELECT COUNT(*) FROM DUAL
• testOnBorrow 、testOnReturn 、testWhileIdle :最好都设为true
• minEvictableIdleTimeMillis :大于0 ,进行连接空闲时间判断,或为0 ,对空闲的连接不进行验证
• timeBetweenEvictionRunsMillis :失效检查线程运行时间间隔,如果小于等于0 ,不会启动检查线程
Ø PS: 在构造GenericObjectPool [BasicDataSource 在其createDataSource () 方法中也会使用GenericObjectPool] 时,会生成一个内嵌类Evictor ,实现自Runnable 接口。如果timeBetweenEvictionRunsMillis 大于0 ,每过timeBetweenEvictionRunsMillis 毫秒Evictor 会调用evict() 方法,检查对象的闲置时间是否大于 minEvictableIdleTimeMillis 毫秒(_minEvictableIdleTimeMillis 小于等于0 时则忽略,默认为30 分钟),是则销毁此对象,否则就激活并校验对象,然后调用ensureMinIdle 方法检查确保池中对象个数不小于_minIdle 。在调用returnObject 方法把对象放回对象池,首先检查该对象是否有效,然后调用PoolableObjectFactory 的passivateObject 方法使对象处于非活动状态。再检查对象池中对象个数是否小于maxIdle ,是则可以把此对象放回对象池,否则销毁此对象
Ø 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证
2. C3P0
Ø C3P0 的官方example 中使用的数据源为ComboPooledDataSource ,网上一篇文章详细介绍了C3P0 连接池配置中各项含义[ 这些配置项的含义在下载解压c3p0 的压缩包之后目录的doc\index.html 中的Configuration 部分也有详细的介绍,这里偷下懒:P ] ,现摘录如下:
<c3p0-config>
<default-config>
<!--当连接池中的连接耗尽的时候 c3p0一次同时获取的连接数。 Default: 3 -->
<property name="acquireIncrement">3</property>

<!--定义在从数据库获取新连接失败后重复尝试的次数。 Default: 30 -->
<property name="acquireRetryAttempts">30</property>

<!--两次连接中间隔时间,单位毫秒。 Default: 1000 -->
<property name="acquireRetryDelay">1000</property>

<!--连接关闭时默认将所有未提交的操作回滚。 Default: false -->
<property name="autoCommitOnClose">false</property>

<!--c3p0将建一张名为 Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么
属性 preferredTestQuery将被忽略。你不能在这张 Test表上进行任何操作,它将只供 c3p0测试
使用。 Default: null-->
<property name="automaticTestTable">Test</property>

<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用 getConnection()的时候继续尝试获取连接。如果设为 true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。 Default: false-->
<property name="breakAfterAcquireFailure">false</property>

<!--当连接池用完时客户端调用 getConnection()后等待获取新连接的时间,超时后将抛出
SQLException,如设为 0则无限期等待。单位毫秒。 Default: 0 -->
<property name="checkoutTimeout">100</property>

<!--通过实现 ConnectionTester或 QueryConnectionTester的类来测试连接。类名需制定全路径。
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
<property name="connectionTesterClassName"></property>

<!--指定 c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认 null即可
Default: null-->
<property name="factoryClassLocation">null</property>

<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.
(文档原文)作者强烈建议不使用的一个属性 -->
<property name="forceIgnoreUnresolvedTransactions">false</property>

<!--每 60秒检查所有连接池中的空闲连接。 Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>

<!--初始化时获取三个连接,取值应在 minPoolSize与 maxPoolSize之间。 Default: 3 -->
<property name="initialPoolSize">3</property>

<!--最大空闲时间 ,60秒内未使用则连接被丢弃。若为 0则永不丢弃。 Default: 0 -->
<property name="maxIdleTime">60</property>

<!--连接池中保留的最大连接数。 Default: 15 -->
<property name="maxPoolSize">15</property>

<!--JDBC的标准参数,用以控制数据源内加载的 PreparedStatements数量。但由于预缓存的 statements
属于单个 connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果 maxStatements与 maxStatementsPerConnection均为 0,则缓存被关闭。 Default: 0-->
<property name="maxStatements">100</property>

<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存 statements数。 Default: 0 -->
<property name="maxStatementsPerConnection"></property>

<!--c3p0是异步操作的,缓慢的 JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能
通过多线程实现多个操作同时被执行。 Default: 3-->
<property name="numHelperThreads">3</property>

<!--当用户调用 getConnection()时使 root用户成为去获取连接的用户。主要用于连接池连接非 c3p0
的数据源时。 Default: null-->
<property name="overrideDefaultUser">root</property>

<!--与 overrideDefaultUser参数对应使用的一个参数。 Default: null-->
<property name="overrideDefaultPassword">password</property>

<!--密码。 Default: null-->
<property name="password"></property>

<!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:
测试的表必须在初始数据源的时候就存在。 Default: null-->
<property name="preferredTestQuery">select id from test where id=1</property>

<!--用户修改系统配置参数执行前最多等待 300秒。 Default: 300 -->
<property name="propertyCycle">300</property>

<!--因性能消耗大请只在需要的时候使用它。如果设为 true那么在每个 connection提交的
时候都将校验其有效性。建议使用 idleConnectionTestPeriod或 automaticTestTable
等方法来提升连接测试的性能。 Default: false -->
<property name="testConnectionOnCheckout">false</property>

<!--如果设为 true那么在取得连接的同时将校验连接的有效性。 Default: false -->
<property name="testConnectionOnCheckin">true</property>

<!--用户名。 Default: null-->
<property name="user">root</property>

<!--早期的 c3p0版本对 JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数
允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始
广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到
支持,但今后可能的版本可能不支持动态反射代理。 Default: false-->
<property name="usesTraditionalReflectiveProxies">false</property>
<property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">25</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">0</property>
    <user-overrides user="swaldman">
    </user-overrides>
</default-config>
<named-config name="dumbTestConfig">
    <property name="maxStatements">200</property>
    <user-overrides user="poop">
      <property name="maxStatements">300</property>
    </user-overrides>
   </named-config>
</c3p0-config>
Ø 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证
Ø 从配置项的内容来看,C3P0 和DBCP 都有比较详细的有关连接检测保证的配置,我们可以看到C3P0 可以控制数据源内加载的PreparedStatements 数量,并且可以设置帮助线程的数量来提升JDBC 操作的速度 ,这些是 DBCP 未提供的 ;另外从网络上的评价来看,DBCP 出现Bug 的频率要大于C3P0 ,不过这一点有待于我们自己实际的检测。
3. Proxool
Ø Proxool 的使用和dbcp 以及c3p0 稍有不同,我们需要并且只需要在使用基本的java.sql.DriverManager 之前加载org.logicalcobwebs.proxool.ProxoolDriver 驱动类, 并且按照proxool 定义的url 格式 ["proxool." + alias + ":" + driverClass + ":" + driverUrl ,其中alias 是为连接池自定义的别名] 来获得connection ;具体的可以参看proxool doc 下的UserGuide ,或本文所附的示例代码。下面对连接池的特性配置作详细说明 [ 这个是自己翻译的,不一定准确,有问题时请参看doc 下的Properties ~] 。
n fatal-sql-exception
以逗号隔开的异常列表,当设置了此项之后,每当出现SQLException时都将与列表中异常项作比较,如果匹配则认为出现fatal异常,这将导致connection被丢弃,并且不论出现任何情况该异常将被重抛一次以通知用户发生的情况。默认值为null
n fatal-sql-exception-wrapper-class
如果配置了fatal-sql-exception ,则默认的操作是丢弃引起SQLException的原因而只是抛出原始异常。使用fatal-sql-exception-wrapper-class这个特性可以将 SQLException包装到继承SQLException或RunTimeException的任何异常类里。Proxool提供了两个类供使用 FatalSQLException和FatalRunTimeException;使用这两个类的话就将该选项设置为 'org.logicalcobwebs.proxool.FatalSQLException'或者 'org.logicalcobwebs.proxool.FatalRuntimeException'。默认值为null
n house-keeping-sleep-time
proxool 自动侦察各个连接状态的时间间隔( 毫秒), 侦察到空闲的连接就马上回收, 超时的销毁,默认值为30 秒
n house-keeping-test-sql
如果侦察线程发现闲置连接,则会使用这个SQL语句来对这些连接进行检查;这项设置的语句应该能够被很快的执行,例如查询当前时间 [info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE");] 。如果不设置则该选项被忽略
n injectable-connection-interface 、injectable-statement-interface 、 injectable-prepared-statement-interface 、 injectable-callable-statement-interface
n jmx
如果此项设为true ,则连接池将被以名称"Proxool:type=Pool, name=<alias>"注册为JMS Server的MBean。默认值为false
n jmx-agent-id
当且仅当jmx选项设为true时使用,为以逗号分隔的连接持注册到的JMS代理名称列表;如果不设置则所有注册的JMX Server都将被使用
n maximum-active-time
线程最大存活时间,超过此时间的线程将被守护线程kill掉,默认值为5分钟
n maximum-connection-count
到数据库的最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由simultaneous-build-throttle决定;默认值为15
n maximum-connection-lifetime
连接最大存活时间,毫秒为单位,默认值为4小时
n minimum-connection-count
不管是否被使用都保持开放 的最小连接数,默认值为5
n overload-without-refusal-lifetime
用来判断连接池状态,如果在此选项设置时间内(毫秒为单位)拒绝了连接,则认为过负载。默认值为60 秒
n prototype-count
最少保持的空闲 连接数,注意与minimum-connection-count区分。默认值为0
n simultaneous-build-throttle
最大的等待请求数,默认值为10
n test-before-use
如果设为true则connection在使用前将以house-keeping-test-sql设置的语句测试,如果测试不通过则该connection被丢弃并会重新分配一个connection。默认为false
n test-after-use
如果设为true则connection在关闭(放回连接池)前将以house-keeping-test-sql设置的语句测试,如果测试不通过connection将被丢弃。默认值为false
Ø 与其它连接池特性的设置方法不同,Proxool 不提供相应的set 方法,所有特性都要以诸如info.setProperty("proxool.jmx", "false"); 方式设定
Ø 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证
Ø Proxool 与DBCP 以及C3P0 的性能比较,网上众说纷纭,有待我们自己的测试;其中http://www.oioj.net/blog/user1/2853/archives/2006/298381.shtml 这篇文章对proxool 和DBCP 做了性能评测,其方法值得我们测试借鉴

分享到:
评论

相关推荐

    PPT模板 -龙湖新员工转正答辩模板.pptx

    PPT模板 -龙湖新员工转正答辩模板.pptx

    PPT模板 -生产计划管理.pptx

    PPT模板 -生产计划管理.pptx

    生产单元数字化改造23年国赛

    生产单元数字化改造23年国赛

    ECharts柱状图-极坐标系下的堆叠柱状图2.rar

    图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143997013

    机器人算法的 Python 示例代码 .zip

    Pythonbot高斯网格图射线投射网格图激光雷达至网格地图k-均值对象聚类矩形接头大满贯迭代最近点 (ICP) 匹配FastSLAM 1.0路径规划动态窗口方法基于网格的搜索Dijkstra 算法A* 算法D*算法D* Lite 算法位场算法基于网格的覆盖路径规划国家网格规划偏极采样车道采样概率路线图(PRM)规划快速探索随机树(RRT)回程时间*RRT* 和 reeds-shepp 路径LQR-RRT*五次多项式规划Reeds Shepp 规划基于LQR的路径规划Frenet 框架中的最佳轨迹路径追踪移动到姿势控制斯坦利控制后轮反馈控制线性二次调节器 (LQR) 速度和转向控制模型预测速度和转向控制采用 C-GMRES 的非线性模型预测控制手臂导航N关节臂对点控制带避障功能的手臂导航航空导航无人机三维轨迹跟踪火箭动力着陆双足动物倒立摆双

    sql综合学习基础知识及练习题考试题实测题.zip

    SQL,全称为结构化查询语言(Structured Query Language),是用于管理和操作关系型数据库的标准化语言。它广泛应用于数据插入、查询、更新和删除等操作,并且拥有超过40年的历史,证明了其在数据处理领域的核心地位。以下是对SQL综合学习基础知识及练习题考试题实测题的介绍

    java面向对象 - 类与对象.doc

    java面向对象 - 类与对象 在Java编程语言中,面向对象编程(OOP)是一个核心概念。它强调以对象作为程序的基本单位,并将相关的数据和功能封装在对象中。类和对象是Java OOP的两个关键组成部分。 ### 类(Class) 类是一个模板或蓝图,它定义了对象的属性和行为。我们可以将类视为对象的类型或种类。通过类,我们可以创建(实例化)具有特定属性和行为的对象。 类的组成部分通常包括: 1. **成员变量**(属性):用于存储对象的状态或数据。 2. **方法**(行为):定义了对象可以执行的操作或功能。 3. **构造方法**:一种特殊类型的方法,用于在创建对象时初始化其状态。 4. **块**(如静态块、实例初始化块):用于执行类级别的初始化代码。 5. **嵌套类**:一个类可以包含其他类,这被称为嵌套或内部类。 ### 对象(Object) 对象是类的实例。它是根据类模板创建的具体实体,具有自己的状态和行为。每个对象都是其类的一个唯一实例,可以访问其类中定义的属性和方法。 创建对象的过程通常涉及以下几个步骤: 1. **声明**:指定对象的类型(即其所属的类

    原生JS实现鼠标感应图片左右滚动代码.zip

    原生JS实现鼠标感应图片左右滚动代码.zip

    随机密码生成器,支持字符、数字、字母大小写组合

    随机密码生成器,支持字符、数字、字母大小写组合

    自动化部署管道创建的代码库(含 Concourse 和 Jenkins 相关).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    高等工程数学试题详解:矩阵分析与最优化方法

    内容概要:本文档为一份高级数学复习试题,内容涵盖线性代数、数值分析及最优化理论等领域,主要包括矩阵范数的计算、遗传算法中的变异操作、内点法解非线性优化问题、证明矩阵有互异特征值、求解矩阵的标准形以及应用单纯形法和FR共轭梯度法解决具体的数学问题等方面。 适合人群:正在备考研究生入学考试或者准备参加各类数学竞赛的学生、对高等数学感兴趣的学习者及从事相关领域科研工作的专业人士。 使用场景及目标:用于巩固和检验个人关于矩阵论、优化方法及概率统计的知识掌握情况,帮助应试者系统地复习相关考点,提高解题技巧。 阅读建议:建议结合具体题目深入理解每一个概念及其应用方式,遇到复杂的计算或证明步骤不妨动手尝试推导一次,这样有助于加深记忆并培养灵活运用知识的能力。同时,在理解算法原理的基础上,还可以参考一些实际案例来进行练习。

    使用了脉冲码调制(PCM).计算了所需的比特率和信号量化误差Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Google 表格 Python API.zip

    Google Spreadsheet Python API v4Google Sheets 配合使用的简单界面。特征通过标题、关键字或URL打开电子表格。读取、写入和格式化单元格区域。共享和访问控制。批量更新。安装pip install gspread要求Python 3.8+。基本用法在 Google API 控制台中创建凭据开始使用 gspreadimport gspreadgc = gspread.service_account()# Open a sheet from a spreadsheet in one gowks = gc.open("Where is the money Lebowski?").sheet1# Update a range of cells using the top left corner addresswks.update([[1, 2], [3, 4]], "A1")# Or update a single cellwks.update_acell("B42", "it's

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集(30份).zip

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集,共30份。 AI辅助编程测评与企业实践 SmartEV和AI 蔚来的思考与实践 下一代 RAG 引擎的技术挑战与实现 书生万象大模型的技术演进与应用探索 人工智能行业数据集构建及模型训练方法实践周华 全方位评测神经网络模型的基础能力 千亿参数 LLM 的训练效率优化 向量化与文档解析技术加速大模型RAG应用落地 基于大模型的缺陷静态检查 多环境下的 LLM Agent 应用与增强 大模型在华为推荐场景中的探索和应用 大模型在推荐系统中的落地实践 大模型的异构计算和加速 大模型辅助需求代码开发 大语言模型在法律领域的应用探索 大语言模型在计算机视觉领域的应用 大语言模型的幻觉检测 小米大模型端侧部署落地探索 快手可图大模型的技术演进与应用探索 提升大模型知识密度,做高效的终端智能 电商大模型及搜索应用实践 百度大模型 原生安全构建之路 硅基流动高性能低成本的大模型推理云实践 语言模型驱动的软件工具思考:可解释与可溯源 长文本大模型推理实践:以 KVCache 为中心的分离式推理架构 阿里云 AI 搜索 RAG 大模型优

    子弹打穿金属后留下弹痕flash动画.zip

    子弹打穿金属后留下弹痕flash动画.zip

    雷达目标一维距离像仿真实验,以及多目标成像 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    原生js竖直动画手风琴下拉菜单代码.zip

    原生js竖直动画手风琴下拉菜单代码.zip

    受循环荷载作用的土壤或路面层分析Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    Centos6.x通过RPM包升级OpenSSH9.7最新版 升级有风险,前务必做好快照,以免升级后出现异常影响业务

    Centos6.x通过RPM包升级OpenSSH9.7最新版 升级有风险,前务必做好快照,以免升级后出现异常影响业务

    营销策划 -阿道夫洗护品牌新品小红书新品营销方案.pptx

    营销策划 -阿道夫洗护品牌新品小红书新品营销方案.pptx

Global site tag (gtag.js) - Google Analytics