数据库连接池的一些基本理解,c3p0和druid
数据库连接池
1,概念:
其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来采访数据时,从容器中获取连接对象,用户访问完后,会将连接对象归还给容器
2,好处:
1,节约资源
2,用户访问高效
3,实现:
1,标准接口:DataSource java.xql包下的
这个接口是没有java官方是没有提供实现类的!
方法:
获取连接:Connection getConnection()
归还连接:如果连接对象Connection是从连接池里获得的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接
2,一般我们不去实现它,有数据库厂商来实现
1,C3P0:数据库连接池技术
2,Druid:数据库连接池的技术,由阿里巴巴提供的
C3P0
步骤:
1,导入两个jar包,也不要忘了导入musql那个jar包
c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar2,定义配置文件
配置文件名称:
c3p0.properties 或 c3p0-config.xmlxml文件内容: xml文件名就是上面那个
<c3p0-config>
<!--使用默认的配置读取连接池对象 -->
<default-config>
<!--连接参数-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///zhoupeng</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数-->
<property name="initialPoolSize">5</property> <!--//初始化连接池-->
<property name="maxPoolSize">10</property><!--连接池最大数-->
<property name="checkoutTimeout">3000</property><!--初始化等待时间,如果3秒没有创建完成,会出异常-->
</default-config>
<named-config name="otherc3p0">
<!--连接参数-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///zhoupeng</property>
<property name="user">root</property>
<property name="password">root</property>
<!--连接池参数-->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>路径:
直接将文件放在src目录下3,创建核心对象 数据库连接池对象 ComboPooledDataSource
DataSource dataSources = new ComboPooledDataSource();4,获取连接:get Connection
Connection connection = dataSources.getConnection();
c390xml文件的验证
<property name="maxPoolSize">10</property><!--连接池最大数-->
验证代码1:
DataSource ds = new ComboPooledDataSource();
for (int i = 0; i <10 ; i++) {
Connection c = ds.getConnection();
System.out.println(i+": "+c);
}
验证代码2:
DataSource ds = new ComboPooledDataSource();
for (int i = 0; i <11 ; i++) {
Connection c = ds.getConnection();
System.out.println(i+": "+c);
}
结果1:
0: com.mchange.v2.c3p0.impl.NewProxyConnection@3d5c822d [wrapping: com.mysql.jdbc.JDBC4Connection@6f46426d]
1: com.mchange.v2.c3p0.impl.NewProxyConnection@49c7b90e [wrapping: com.mysql.jdbc.JDBC4Connection@10d307f1]
2: com.mchange.v2.c3p0.impl.NewProxyConnection@3e84448c [wrapping: com.mysql.jdbc.JDBC4Connection@4a7f959b]
3: com.mchange.v2.c3p0.impl.NewProxyConnection@5403f35f [wrapping: com.mysql.jdbc.JDBC4Connection@483f6d77]
4: com.mchange.v2.c3p0.impl.NewProxyConnection@63a12c68 [wrapping: com.mysql.jdbc.JDBC4Connection@28f3b248]
5: com.mchange.v2.c3p0.impl.NewProxyConnection@32b260fa [wrapping: com.mysql.jdbc.JDBC4Connection@581ac8a8]
6: com.mchange.v2.c3p0.impl.NewProxyConnection@57d7f8ca [wrapping: com.mysql.jdbc.JDBC4Connection@76c3e77a]
7: com.mchange.v2.c3p0.impl.NewProxyConnection@67c33749 [wrapping: com.mysql.jdbc.JDBC4Connection@fba92d3]
8: com.mchange.v2.c3p0.impl.NewProxyConnection@fa49800 [wrapping: com.mysql.jdbc.JDBC4Connection@71238fc2]
9: com.mchange.v2.c3p0.impl.NewProxyConnection@16a0ee18 [wrapping: com.mysql.jdbc.JDBC4Connection@3d6f0054]
结果2:
0: com.mchange.v2.c3p0.impl.NewProxyConnection@3d5c822d [wrapping: com.mysql.jdbc.JDBC4Connection@6f46426d]
1: com.mchange.v2.c3p0.impl.NewProxyConnection@49c7b90e [wrapping: com.mysql.jdbc.JDBC4Connection@10d307f1]
2: com.mchange.v2.c3p0.impl.NewProxyConnection@3e84448c [wrapping: com.mysql.jdbc.JDBC4Connection@4a7f959b]
3: com.mchange.v2.c3p0.impl.NewProxyConnection@5403f35f [wrapping: com.mysql.jdbc.JDBC4Connection@483f6d77]
4: com.mchange.v2.c3p0.impl.NewProxyConnection@63a12c68 [wrapping: com.mysql.jdbc.JDBC4Connection@28f3b248]
5: com.mchange.v2.c3p0.impl.NewProxyConnection@32b260fa [wrapping: com.mysql.jdbc.JDBC4Connection@581ac8a8]
6: com.mchange.v2.c3p0.impl.NewProxyConnection@57d7f8ca [wrapping: com.mysql.jdbc.JDBC4Connection@76c3e77a]
7: com.mchange.v2.c3p0.impl.NewProxyConnection@67c33749 [wrapping: com.mysql.jdbc.JDBC4Connection@fba92d3]
8: com.mchange.v2.c3p0.impl.NewProxyConnection@fa49800 [wrapping: com.mysql.jdbc.JDBC4Connection@71238fc2]
9: com.mchange.v2.c3p0.impl.NewProxyConnection@16a0ee18 [wrapping: com.mysql.jdbc.JDBC4Connection@3d6f0054]
Exception in thread "main" java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:118)
at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:77)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:690)
at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
at ShuJuKuLianJieChi.main(ShuJuKuLianJieChi.java:12)
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@15aab8c6 -- timeout at awaitAvailable()
at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1505)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:644)
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:554)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:758)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:685)
... 2 more
Druid
步骤:
1,还是先导jar包,druid-1.2.9.jar
2,定义配置文件
可以是properties形式的
可以任意名字,可以放任意目录(意思是需要手动导入了)
建议还是放到src下
dirverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///zhoupeng
username=root
password=root
# 这些和刚刚c3p0的配置文件差不多,就不写多的注释了
initialSize=5
maxActive=10
maxWait=30003,加载配置文件
Properties p = new Properties();
InputStream in = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
p.load(in);4,获取数据库连接池对象:
通过一个工厂来获取:DruidDataSourceFactory
DataSource ds = DruidDataSourceFactory.createDataSource(p);5,获取连接,getConnection
Connection c=ds.getConnection();
数据库连接池的一些基本理解,c3p0和druid的更多相关文章
- .数据库连接池技术:DBCP和C3P0
数据库连接池技术:DBCP和C3P0 1.什么是数据库连接池 已知的方法是需要访问数据库的时候进行一次数据库的连接,对数据库操作完之后再释放这个连接,通常这样业务是缺点很明显的: 用户每次请求都需要向 ...
- JDBC 学习笔记(三)—— 数据源(数据库连接池):DBCP数据源、C3P0 数据源以及自定义数据源技术
本文目录: 1.应用程序直接获取连接的缺点(图解) 2.使用数据库连接池优化程序性能(图解) 3.可扩展增强某个类方法的功能的三种方式 4.自定 ...
- 数据库连接池和connection的理解
数据库连接池Data Source Pool的理解 1.数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接,避免了每个方法里new connection的耗费资源和时间. ...
- 数据库连接池dataesoruce pool深入理解
8.数据库连接池的connection都是长连接的,以方便多次调用,多人连续使用.dataSourcePool9.数据库连接池中的连接,是在你用完之后,返回给数据库连接池的,并不是close()掉,而 ...
- 理解数据库连接池和ThreadLocal实现的事务控制
我发现 不少人 误解了这两者. csdn上也有人提出过这种疑问: http://bbs.csdn.net/topics/250061733 经过查阅资料和认真分析,我特说明一下这两者概念上的区别. 我 ...
- JDBC(三)数据库连接池(DBCP、C3P0)
前言 这段时间状态有一点浮躁,希望自己静下心来.还有特别多的东西还没有学懂.需要学习的东西非常的多,加油! 一.JDBC复习 Java Data Base Connectivity,java数据库连接 ...
- java_JDBC,连接数据库方式,RestSet结果集,Statement,PreparedStatement,事务,批处理,数据库连接池(c3p0和Druid)、Apache-DBUtils、
一.JDBC的概述 1.JDBC为访问不同的数据薛是供了统一的接口,为使用者屏蔽了细节问题.2. Java程序员使用JDBC,可以连接任何提供了JDBC驱动程序的数据库系统,从而完成对数据库的各种操作 ...
- 数据库连接池Druid的介绍,配置分析对比总结
Druid的简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBos ...
- 从零开始学 Java - 数据库连接池的选择 Druid
我先说说数据库连接 数据库大家都不陌生,从名字就能看出来它是「存放数据的仓库」,那我们怎么去「仓库」取东西呢?当然需要钥匙啦!这就是我们的数据库用户名.密码了,然后我们就可以打开门去任意的存取东西了. ...
随机推荐
- DDD-领域驱动(三)-聚合与聚合根
概念 高内聚 , 高内聚合Aggregate 就好比一个功能,各个模块互相是有依赖关系存在,例如: 低耦合:模块可以任意替换,不会影响系统的工作 例如:比如你今天穿了这套衣服,明天穿了另一套衣服,但你 ...
- 会话跟踪技术 - Cookie 和 Session 快速上手 + 登陆注册案例
目录 1. 会话跟踪技术概述 2. Cookie 2.1 Cookie的概念和工作流程 2.2 Cookie的基本使用 2.3 Cookie的原理分析 2.4 Cookie的使用细节 2.4.1 Co ...
- 微软出品自动化神器【Playwright+Java】系列(五) 之 常见点击事件操作
写在前面 明天就是周五了,这周有那么一两天心情特别不好,真的是做什么都没兴致,所以导致整个人都很丧,什么都不想做. 本打算周一就更新这篇文章的,但由于公司一直加班,每天到家很晚,都是挤时间去学,理解后 ...
- React魔法堂:echarts-for-react源码略读
前言 在当前工业4.0和智能制造的产业升级浪潮当中,智慧大屏无疑是展示企业IT成果的最有效方式之一.然而其背后怎么能缺少ECharts的身影呢?对于React应用而言,直接使用ECharts并不是最高 ...
- pip cmd下载速度慢解决方案
cmd下载速度慢不是电脑问题,而是下载的网站有网速限制,如pip,虽然没被墙,但由于是外网,网速极差,经常是几KB一秒,所以我们可以采用镜像服务器,即在命令后加上 -i https://pypi.tu ...
- 现在入行Java真的还有出路吗?
现在入行Java还来的及吗?未来该如何抉择? 最近有点迷茫了,互联网好像一夜之间进入了寒冬一样,到处都是就业难的样子,当然,不可否认的是,那些努力的大佬依旧是斩获多个offer,但是,窝就一个小镇做题 ...
- loguru库使用
参考: https://github.com/Delgan/loguru https://loguru.readthedocs.io/en/stable/overview.html https://b ...
- 嵌入式-C语言基础:结构体
数组只能存放一种类型的数据,而结构体内可以存放不同类型的数据. #include<stdio.h> #include <string.h> struct Student { c ...
- 嵌入式-C语言基础:二维数组
二维数组的每个元素都是一个一维数组,例如int arr[2][3]={{1,2,3},{4,5,6}}; 下面通过几个例子来对二维数组进行深入了解:二维数组可以看作是一个父数组,他的每个元素都是一个一 ...
- 解决头部使用 position:fixed; 固定定位后遮住下方内容的问题
1.在头部下面给一个空的 div 给这个div设置高度,把页面撑开,这种方法是让头部刚好遮住的是这个空div,把内容放出来. 但是这种方法需要一点点调试高度,所以不推荐. 2.把整个要使用 posit ...