了解连接池

1.简介

连接池是一种通过在池中打开和管理N个数据库连接来提高应用程序性能的技术。 该应用程序只是请求连接,使用它,然后将其放回池中。 当应用程序需要连接时,就绪连接将保持可用状态,以供池中使用。 池管理连接生命周期,因此开发人员实际上不需要等待连接建立并过滤掉过时的连接。

连接池机制节省了昂贵的操作,可以在应用程序运行时建立网络连接,并最终在后端初始化数据库会话。

2. Tomcat中的连接池实现

领先的应用程序服务器Tomcat与Commons DBCP数据源打包在一起作为默认的JNDI数据源,除非我们将DataSourceFactory明确指定为–

要使用Apache Commons DBCP连接池

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/javatest" factory="org.apache.commons.dbcp.BasicDataSourceFactory"/>

使用Tomcat JDBC连接池

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/javatest" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

工厂是必需的, 类型应始终为javax.sql.DataSource

DBCP的优点在于,它可以与许多应用程序或框架一起使用,并且可以与市场上几乎所有数据库一起使用。

3.比较池机制

使用Commons DBCP连接池机制时 ,Tomcat会获取Commons DBCP源(该版本取决于Tomcat版本,例如Tomcat 7.0.27使用Commons DBCP 1.4),并进行软件包名称替换( org.apache.commons- > org)。 apache.tomcat.dbcp )并将结果构建为tomcat-dbcp.jar 。 这样做是为了使内部Tomcat JDBC池永远不会与Commons DBCP类的可能应用程序使用冲突。 这避免了许多潜在的类加载问题。 “ dbcp”软件包与数据源管理有关。

同样, Tomcat JDBC连接池机制(org.apache.tomcat.jdbc.pool。*)是与Apache Commons DBCP竞争的数据库连接池的替代升级实现。 它是与Tomcat分开的项目(在Tomcat模块下-> jdbc-pool),但是它在Tomcat 7中首次亮相(从2011年7月的7.0.19开始)。 两种实现都有优点和缺点,但是Apache Commons DBCP仍被更广泛地使用。

无论哪种情况,都需要将各自的JAR( commons-dbcp.jartomcat-jdbc.jar )包含到构建路径中。

较早版本的Apache Commons DBCP(即1.2版)在高负载条件下存在一些令人讨厌的线程安全问题,使其不适合这种用法,这就是重写Tomcat JDBC连接池的原因。

Tomcat JDBC连接池的用法也非常简单,对于已经熟悉DBCP的人来说,过渡非常简单。

4.基于休眠的应用程序中的连接池

Hibernate使用其魔力来根据您配置的属性来标识要使用的连接池提供程序。

对于c3p0 –

<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>

对于Apache Commons DBCP –

<property name="hibernate.dbcp.initialSize">8</property>
<property name="hibernate.dbcp.maxActive">20</property>
<property name="hibernate.dbcp.maxIdle">20</property>
<property name="hibernate.dbcp.minIdle">0</property>

相应的JAR文件需要手动或使用Maven在lib目录中。

我们也可以使用hibernate.connection.provider_class属性明确指定连接提供者,尽管实际上并不需要它。

<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_size">19</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">10</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>

如果我们不使用Hibernate配置连接池,则使用默认值。 启动应用程序时,它在日志或控制台输出中可见–

org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

Hibernate中默认连接池实现不适合生产使用,主要是因为它具有配置约束。

如果使用的是应用程序服务器,则可能希望使用内置池(通常使用JNDI获得连接)。

要使用JNDI配置将服务器的内置池与Hibernate一起使用,我们需要在Hibernate配置文件中设置以下属性–

hibernate.connection.datasource=java:/comp/env/jdbc/TestDB

–假设TestDB是Tomcat JDBC连接池数据源的JNDI名称(请参见上面第2节中的代码段)。

如果您不能或不希望使用应用程序服务器的内置连接池,则Hibernate支持其他几个连接池,例如–

  1. c3p0
  2. Proxool

在Apache DBCP之后,第二好的连接池实现是c3p0 ,它很容易与Hibernate集成,并且据说可以提供良好的性能。

5.有用的链接

如何在Hibernate中配置C3P0连接池

翻译自: https://www.javacodegeeks.com/2016/11/understanding-connection-pooling.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux上很方便的上传下载文件工具rz和sz

linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ######################################################### #《老男孩linux就业培训中心-初级班第七期第一节内容总结。 #linux上很方便的上传下载文件工具rz和sz #date:2011-06-15 #作者&#xff1a;老男孩…

SAS学习︱逻辑库、数据集创建与查看、数据库链接(SAS与R的code对照)

一、逻辑库、数据集、数据字典 数据字典>逻辑库>数据集 逻辑库工作空间&#xff0c;存储四类内容&#xff0c;test是数据集文件&#xff0c;views是视图&#xff08;相当于R里面的views点击查看&#xff09;&#xff0c;formats代表文件&#xff0c;sasmacr代表目录内容…

sqlserver 如何把一列分为一行显示_SqlServer数据库如何快速修改表的一列值

工作中我们会遇到一个表的一列值需要进行整体更换为另一个表的某个字段的值&#xff0c;那么我们该如何处理呢&#xff1f;数据源Room表新的Room表现将Room表的RoomTypeID列替换成Room_new表的RoomTypeID方法一&#xff1a;直接修改update Room set RoomTypeID (select RoomTy…

Linux 命令行通配符及转义符的实现

我们想对一类文件批量操作&#xff0c;例如批量查看硬盘文件属性&#xff0c;那么正常命令会是&#xff1a; [rootlinuxprobe ~]# ls /dev/sda [rootlinuxprobe ~]# ls /dev/sda1 [rootlinuxprobe ~]# ls /dev/sda2 [rootlinuxprobe ~]# ls /dev/sda3 但有些时候确实不知道分区…

windows python 访问mtp存储空间_用Windows电脑训练深度学习模型?超详细配置教程来了...

虽然大多数深度学习模型都是在 Linux 系统上训练的&#xff0c;但 Windows 也是一个非常重要的系统&#xff0c;也可能是很多机器学习初学者更为熟悉的系统。要在 Windows 上开发模型&#xff0c;首先当然是配置开发环境。Kaggle Master 及机器学习实践者 Abhinand 立足于自己的…

Matlab自带排序函数sort用法

Matlab自带排序函数sort用法 [Y,I] sort(X,DIM,MODE) sort函数默认Mode为ascend为升序&#xff0c;sort(X,descend)为降序排列。 sort(X)若X是矩阵&#xff0c;默认对X的各列进行升序排列 sort(X,dim) dim1时等效sort(X) dim2时表示对X中的各行元素升序排列 Matlab中给一维向量…

PostgreSQL学习手册(数据表)

一、表的定义&#xff1a; 对于任何一种关系型数据库而言&#xff0c;表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。 1. 创建表&#xff1a; CREATE TABLE products ( product_no integer, name text, price nu…

织梦联动类别-地区调用不显示第三级城市的解决方法

织梦联动类别-地区调用不显示第三级城市的原因 1、附加表dede_addoninfos 或者 你的其他表中的字段nativeplace数据类型为int型&#xff0c;无法保存第三级城市对应的的evalue值(比如&#xff1a;东山区 对应的 10001.001) 2、枚举表dede_sys_enum中的第三级城市对应evalue值…

js 随机1-10随机数_寻找随机的错误-一个真实的故事

js 随机1-10随机数几周前&#xff0c;我完成了RapidFTR开源项目的错误查找 &#xff0c;这花了我三个晚上。 我认为可能值得分享狩猎的故事。 本文将介绍我的工作。 我将概述我的旅程&#xff0c;以便真正找到正在发生的事情的根本原因。 我在本文中的目标是突出显示可以使用的…

用python写九九乘法口诀表左上角_python打出九九乘法口诀表

用IDLE打出乘法口诀表&#xff0c;想要就是如下图的结果&#xff1a;实现算法很简单&#xff0c;但是IDLE(python3.7)默认的换行输出方式不太容易实现&#xff0c;得需费一番脑筋。代码如下&#xff1a;*row0 #设置行数&#xff0c;值为1时候…

设计模式(一)Chain Of Responsibility责任链模式

设计模式篇章&#xff0c;源于网课的学习&#xff0c;以及个人的整理 在我们接收用户提交的字符时&#xff0c;常常会使用到过滤&#xff0c;在学习责任链模式前&#xff0c;我们是这样做的 1.定义一个类 public class MsgProcesser {String msg;public MsgProcesser(String ms…

如果你是IT技术人员,请思考这15个问题

行内的人自嘲是程序猿、屌丝和码农&#xff0c;行外的人也经常拿IT人调侃&#xff0c;那么究竟是IT人没有价值&#xff0c;还是没有仔细思考过自身的价值&#xff1f; 1.搞IT的是屌丝、码农、程序猿&#xff1f; 人们提到IT人的时候&#xff0c;总会想到他们呆板、不解风情&…

在Windows上运行-XX:CompileCommand

HotSpot JVM提供了几个与即时 &#xff08; JIT &#xff09;编译有关的命令行参数。 在本文中&#xff0c;我介绍了开始应用命令行标志-XX&#xff1a;CompileCommand所需的步骤&#xff0c;以查看对单个方法执行的即时编译。 JIT概述 Nikita Salnikov-Tarnovski的博客文章您…

匹配中文字符的正则表达式: [u4e00-u9fa5](

匹配双字节字符(包括汉字在内)&#xff1a;[^x00-xff]评注&#xff1a;可以用来计算字符串的长度&#xff08;一个双字节字符长度计2&#xff0c;ASCII字符计1&#xff09;匹配空白行的正则表达式&#xff1a;ns*r评注&#xff1a;可以用来删除空白行匹配HTML标记的正则表达式&…

python define function的顺序_Python怎么根据一个函数来决定列表顺序

def__init__(self,function):self._queue[]self.functionfunction然后要写一往列表里增加元素的方法&#xff0c;按照function排序&#xff0c;function类型为函数defadd(self,item):"""AddtothisP...def __init__(self,function):self._queue []self.function…

excel单元格内容合并

这几天在整理数据&#xff0c;有时候数据都在表格的不同单元格中&#xff0c;想把两格内容合并为一格&#xff0c;于是验证了两种方法方法一:(1)在B1输入公式A1&B1(2)做完第一步后,选中B1后,鼠标移到单元格右下出现“”符号是下拉,就能得到结果,如图:方法二(1)在B1输入公式…

主分区与逻辑分区的区别

硬盘分区有三种&#xff0c;主磁盘分区、扩展磁盘分区、逻辑分区。 一个硬盘可以有一个主分区&#xff0c;一个扩展分区&#xff0c;也可以有一个主分区和若干逻辑分区。&#xff08;图1为大家最常见硬盘分区类型&#xff09; 主分区 主分区是硬盘的启动分区&#xff0c…

wxpython图形编程_wxpython  图像编程

1)目前遇到一个问题&#xff0c;就是wxpython显示一个图片&#xff0c;然后可以在图片上画矩形&#xff0c;点&#xff0c;line&#xff0c;circle and soon&#xff0c;最后保存矩形的坐标.但是现在可以在屏幕上画矩形&#xff0c;无法在图片上做标记&#xff0c;我反思的原因…

如何利用火狐获取网址中的提交链接

1、添加firebugz组件 2、用火狐打开你要的获取链接的网址例如 http://www.dce.com.cn/dalianshangpin/xqsj/tjsj26/jdtj/jdcjpm/index.html 3、按F12 4、点击你查询的按钮如点击如图下中的年月然后在firebug上点击网络获取里面的post链接 5、点击HTML 中的一个post &#xf…

python-22 eval json pickle shelve 之间差别

1.eval:可以转化字符串&#xff0c;字典&#xff0c;元组&#xff0c;列表等一般类型&#xff0c;不能转化类&#xff0c;函数 2.json:可以转化一般类型外&#xff0c;还可转化函数&#xff0c;可以在任何语言间转化&#xff0c;转化为字符串&#xff0c;可以写入文本&#xff…