c3p0连接池的配置和简单使用

背景

 一般我们在项目中操作数据库时,都是每次需要操作数据库就建立一个连接,操作完成后释放连接。因为jdbc没有保持连接的能力,一旦超过一定时间没有使用(大约几百毫秒),连接就会被自动释放掉。而每次新建连接都需要140毫秒左右的时间,所以耗费时间比较多。若使用C3P0连接池来池化连接,随时取用,则平均每次取用只需要10-20毫秒。这在高并发随机访问数据库的时候对效率的提升有很大帮助。

    C3P0连接池会根据你的配置来初始化N个数据库连接,空闲T时间后连接过期又会自动新建K个连接使得连接池总有空闲的数据库连接等待被取用。我们只需通过dataSourse.getConnection()即可从线程池中取用一个已经连接好的空闲连接,执行数据库操作。然后“断开”(放回)这个连接,把这个连接的使用权放回连接池。真正的数据库连接的创建与释放是由C3P0在后台自动完成的,我们花的只是取用与释放占用权的时间。全程耗时10+毫秒,比原来提高了几十倍


 

下载

c3p0下载地址:https://sourceforge.net/projects/c3p0/files/latest/download?source=files   下载完成后,将解压出来有3个jar包:

                       

将这三个jar包导入项目中, 在src目录下新建一个名叫  c3p0-config.xml  的文件,注意,必须是这个文件名。 

 


配置 

c3p0-config.xml的示例代码如下图所示:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>  <!-- 默认配置 -->  <default-config>  <property name="initialPoolSize">10</property>  <property name="maxIdleTime">30</property>  <property name="maxPoolSize">100</property>  <property name="minPoolSize">10</property>  <property name="maxStatements">200</property>  </default-config>  <!-- 配置oracle连接池 -->  <named-config name="oracle">  <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>  <property name="jdbcUrl">jdbc:oracle:thin:@192.168.1.138:1521:ecology</property>  <property name="user">test1028</property>  <property name="password">test1028</property>  <property name="initialPoolSize">10</property>  <property name="maxIdleTime">30</property>  <property name="maxPoolSize">100</property>  <property name="minPoolSize">10</property>  <property name="maxStatements">200</property>  </named-config>  <!--配置连接池mysql--><named-config name="mysql">  <property name="driverClass">com.mysql.jdbc.Driver</property>  <property name="jdbcUrl">jdbc:mysql://192.168.1.123:3306/CoupleSpace</property>  <property name="user">root</property>  <property name="password">root</property>  <property name="initialPoolSize">10</property>  <property name="maxIdleTime">30</property>  <property name="maxPoolSize">100</property>  <property name="minPoolSize">10</property>  <property name="maxStatements">200</property>  </named-config> <!-- 配置其他连接池-->
</c3p0-config>

 更细致的配置说明如下图所示:

<!--acquireIncrement:链接用完了自动增量3个。 --><property name="acquireIncrement">3</property><!--acquireRetryAttempts:链接失败后重新试30次。--><property name="acquireRetryAttempts">30</property><!--acquireRetryDelay;两次连接中间隔1000毫秒。 --><property name="acquireRetryDelay">1000</property><!--autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚。 --><property name="autoCommitOnClose">false</property><!--automaticTestTable:c3p0测试表,没什么用。--><property name="automaticTestTable">Test</property><!--breakAfterAcquireFailure:出错时不把正在提交的数据抛弃。--><property name="breakAfterAcquireFailure">false</property><!--checkoutTimeout:100毫秒后如果sql数据没有执行完将会报错,如果设置成0,那么将会无限的等待。 --> <property name="checkoutTimeout">100</property><!--connectionTesterClassName:通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester--><property name="connectionTesterClassName"></property><!--factoryClassLocation:指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可。--><property name="factoryClassLocation">null</property><!--forceIgnoreUnresolvedTransactions:作者强烈建议不使用的一个属性。--> <property name="forceIgnoreUnresolvedTransactions">false</property><!--idleConnectionTestPeriod:每60秒检查所有连接池中的空闲连接。--> <property name="idleConnectionTestPeriod">60</property><!--initialPoolSize:初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。 --> <property name="initialPoolSize">3</property><!--maxIdleTime:最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。--><property name="maxIdleTime">60</property><!--maxPoolSize:连接池中保留的最大连接数。 --><property name="maxPoolSize">15</property><!--maxStatements:最大链接数。--><property name="maxStatements">100</property><!--maxStatementsPerConnection:定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0  --><property name="maxStatementsPerConnection"></property><!--numHelperThreads:异步操作,提升性能通过多线程实现多个操作同时被执行。Default: 3--> <property name="numHelperThreads">3</property><!--overrideDefaultUser:当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0的数据源时。Default: null--> <property name="overrideDefaultUser">root</property><!--overrideDefaultPassword:与overrideDefaultUser参数对应使用的一个参数。Default: null--><property name="overrideDefaultPassword">password</property><!--password:密码。Default: null--> <property name="password"></property><!--preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 测试的表必须在初始数据源的时候就存在。Default: null--><property name="preferredTestQuery">select id from test where id=1</property><!--propertyCycle:用户修改系统配置参数执行前最多等待300秒。Default: 300 --> <property name="propertyCycle">300</property><!--testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。Default: false --><property name="testConnectionOnCheckout">false</property><!--testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --><property name="testConnectionOnCheckin">true</property><!--user:用户名。Default: null--><property name="user">root</property><!--usesTraditionalReflectiveProxies:动态反射代理。Default: false--><property name="usesTraditionalReflectiveProxies">false</property>

 


使用方式

新建一个c3p0的工具类,如下图所示:


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0Util {	static ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");/*** 获取数据库连接* @return* @throws SQLException */public static Connection getConnection() throws SQLException{return dataSource.getConnection();}/*** 关闭数据库连接* @throws SQLException */public static void closeConnection(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet) throws SQLException{if (connection!=null && !connection.isClosed()) {connection.close();}if (preparedStatement!=null && !preparedStatement.isClosed()) {preparedStatement.close();}if (resultSet != null && !resultSet.isClosed()) {resultSet.close();}}
}

在jdbc中使用c3p0工具类获得连接并查询数据:

	public ArrayList<Dept> queryDepts() throws SQLException{ArrayList<Dept> depts = new ArrayList<Dept>();try(Connection connection = C3P0Util.getConnection();PreparedStatement stmt=connection.prepareStatement("select * from ecology09171.bm");ResultSet rs=stmt.executeQuery();){while(rs.next()){Dept dept = new Dept();long id = rs.getLong("ID");String departmentName = rs.getString("DEPARTMENTNAME");long supDepID = rs.getLong("SUPDEPID");long subCompanyID1 = rs.getLong("SUBCOMPANYID1");String departmentMark = rs.getString("DEPARTMENTMARK");String canceled = rs.getString("CANCELED");dept.setID(id);dept.setSUPDEPID(supDepID);dept.setSUBCOMPANYID1(subCompanyID1);dept.setDEPARTMENTNAME(departmentName);dept.setDEPARTMENTMARK(departmentMark);dept.setCANCELED(canceled);depts.add(dept);}return depts;}}

 

 

 

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

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

相关文章

Iterator_迭代器模式_PHP语言描述

2019独角兽企业重金招聘Python工程师标准>>> 感觉最近写的这些设计模式的例子&#xff0c;在定义描述方面差很多&#xff0c;以后都会先写一下用例设计模式的定义及简单讲解&#xff0c;在把例子附上&#xff0c;这样的感觉更好些&#xff0c;也让大家看得更清楚一些…

Spring整合JDBC开发

背景 在JDBC开发中&#xff0c;充斥这大量重复的代码&#xff0c;可能只是换了个SQL语句&#xff0c;其他代码是完全不用变的。Spring的jar包里&#xff0c;提供了一个叫JDBCTemplate的模板&#xff0c;在保持操作灵活方便的情况下&#xff0c;将代码量降到最低。 配置文件 首…

基于SpringMVC进行REST服务开发

背景 REST的概念这里不多过多阐述。在REST中&#xff0c;资源通过URL进行识别和定位。一般来说&#xff0c;以下这些HTTP方法通常会匹配为如下的CRUD动作&#xff1a; Create&#xff1a;POST Read&#xff1a;GET Update&#xff1a;PUT或PATCH Delete&#xff1a;DELETE…

PCI总线原理(二)

http://blog.c114.net/html/15/562315-75227.html PCI即Peripheral Component Interconnect&#xff0c;中文意思是“外围器件互联”&#xff0c;是由PCISIG (PCI Special Interest Group)推出的一种局部并行总线标准。在现在电子设备中应用非常广泛&#xff0c;下面我详细介绍…

Windows环境中在同一个Tomcat下发布不同端口号的不同web程序

一、修改Tomcat路径下的conf文件下的 server.xml 文件。增加一个service 节点。 原service节点如下图所示&#xff1a; 新增service节点如下图所示&#xff0c;注意红色标注的是要修改的地方&#xff1a; 二、根据service.xml配置文件信息中对应的Engine节点的name属性&#…

Mybatis逆向工程自动生成代码文件

一般来说都会新建另外一个项目&#xff0c;用于生成代码文件&#xff0c;然后拷贝到需要的项目中。新建maven项目用于生成代码文件&#xff0c;项目目录如下所示&#xff1a; pom.xml内容如下&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" x…

LAMP平台架构浅析

LAMP是一个缩写&#xff0c;它指一组常用于来搭建动态网站或者服务器的开源软件&#xff0c;包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;PHP、Perl或者 Python编程语言(本文以php为例)。 下面就介绍一下如何基于rpm包的形式…

Log4j.properties的简单配置

一、首先导入jar包&#xff1a;log4j-1.2.17.jar 二、新增log4j.properties配置文件并输入以下内容&#xff1a; 三、在测试代码总中进行测试&#xff1a; Service public class CKKuCunServiceImpl implements CKKuCunService{Autowiredpublic CKKuCunMapper ckKuCunMapper;…

建立openstack quantum开发环境 .

建立openstack quantum开发环境 作者&#xff1a;张华 发表于&#xff1a;2012-4-6 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) 上篇中讲了如何建立openstack的最小开发环…

使用Jquery插件bTabs实现多页签打开效果

官网地址&#xff1a;点击这里进入官网 资源导入 <link rel"stylesheet" href"b.tabs.css" type"text/css"> <!-- 插件核心脚本 --> <script type"text/javascript" src"b.tabs.js" ></script> &l…

体验Office 2013预览版

微软目前刚发布新版本的office2013,暂时没有中文版。Windows 8下搭配64位office 2013效果非常不错&#xff0c;具体浏览下方的视频。 X86&#xff08;32位&#xff09; 英文版&#xff1a;http://care.dlservice.microsoft.com/download/4/7/1/4712B4E1-4DD9-4468-B8A4-507D7F9…

网络营销第四课:网络营销需要掌握的网页代码(2)

1、<hr>水平线标记&#xff1a;<HTML> <HEAD> <TITLE>HR的用法</TITLE> </HEAD> <BODY> <H3>插画中国论坛:漫画 卡通 吉祥物 游戏 海报(原创) </H3> <HR size 15 align left width 80%> <HR color"…

PDA手持终端WinCE系统连接SqlServer数据库

引言&#xff1a;因项目需求需要通过使用PDA手持终端对条码进行数据采集&#xff0c;并将数据传输到SqlServer进行增删改查操作&#xff0c;一般来说&#xff0c;跟sqlserver的版本没有特别大的关系&#xff0c;我见过用05的、08的、我自己用的2014版本。PDA用的是基恩士的&…

堆和栈、值类型与引用类型、装箱与拆箱

堆栈&#xff1a;内存条里的某一块。 电脑中有6个地方可以保存数据。 <1>寄存器&#xff1a;保存最快。这东西在处理器内部。也就是CPU里的一小块地方给你放数据。既然是CPU&#xff0c;那么主要工作是计算&#xff0c;所以这块寄存器能放的东西十分有限&#xff0c;寄存…

ASP.NET MVC 上传图片到项目目录中的文件夹并显示

因项目需求&#xff0c;需要一个上传图片并显示的功能&#xff0c;类似于上传头像并显示出来。查阅了网上资料&#xff0c;写了个Demo&#xff0c;希望能帮助到更多的人。此Demo基于ASP.NET MVC实现。 选择图片&#xff1a; 点击按钮进行上传&#xff1a; 一、先在项目中新建一…

JQuery Datatables 样式Style

用了这么久的datatables&#xff0c;才发现datatables有具体的样式和详细说明&#xff0c;还可以自定义配置查看。 点击这里进入datatables官网具体样式查看 一、所有的class属性及示例HTML代码写法&#xff1a; 二、 表格内样式(字体居中、居左、居右等)&#xff0c;targets代…

Juniper SA SSL ×××配置宁盾DKEY短信动态密码步骤

1. 方案简介 传统的双因子认证技术是基于硬件令牌方式&#xff0c;IT管理员会为每个用户分配分发一只令牌&#xff0c;用户登录时输入令牌上显示的6位随即数字&#xff0c;即可完成登录是目前最为常用的强身份认证方案&#xff0c;它最大优点在于认证响应度高&#xff0c;然而采…

使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值。

一、报错截图如下所示&#xff1a; 二、报错代码&#xff1a; List<BarcodeEntity> Lists _IBarcode.GetBarcodeByWhAndType(WhId,BarcodeType); return Json(Lists,JsonRequestBehavior.AllowGet); 三、修正代码&#xff1a; List<BarcodeEntity> Lists _IBa…

DevExpress之TreeList节点绑定图片

最近在项目中使用到了DX中的TreeList控件绑定数据源时在每个节点前显示特点的图片&#xff1b;查阅相关资料实现方法如下&#xff1a;1.首先打开VS2010新建一个WINFROM应用程序&#xff1b; 2.在WINFROM应用程序中增加DX中的TreeList控件&#xff1b;如下图&#xff1a; 3.在窗…