JavaWeb之数据库连接池
时间:2016-12-2 23:56
——DBCP连接池
连接池参数(所有连接池参数都有默认值):
初始大小
最小空闲连接数
增量
最大空闲连接数
最大连接数
最长等待时间
四大连接参数:
连接池也是使用四大连接参数来完成创建连接对象的。
实现的接口:
连接池必须实现:javax.sql.DataSource接口。
连接池返回的Connection对象,它的close()方法并不是关闭连接,而是把连接归还给连接池,使用的是装饰设计模式。
dbcp.properties配置:
#基本配置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb
username=root
password=root
#初始化池大小,即一开始池中连接对象的数量
#默认值为0
initialSize=0
#最大连接数,如果设置maxActive=50时,表示池中最多可以有50个连接,包含使用和未使用的连接
#默认为8,如果设置为非正数,表示无限大
maxActive=8
#最大空闲连接数
#默认为8,如果设置为非正数,表示无限大
maxIdle=8
#最小空闲连接数
#默认值为0
minIdle=0
#最大等待时间
#当设置maxWait=5000时,表示等待5秒,超时会抛出异常
#默认值为-1,表示无期限等待,超时不会抛异常
maxWait=-1
#连接属性
#就是之前放在url之后的参数,现在可以使用connectionPreperties来指定
#userServerPrepStmts=true,表示MySQL开启预编译功能。
#cachePrepStmts=true,表示MySQL开启缓存PrepareStatement功能。
#prepStmtCacheSize=50,表示缓存PreparedStatement的上限。
#prepStmtCacheSqlLimit=300,当SQL模板长度大于200时,就不再缓存它。
#连接的默认提交方式
#默认值为true,表示自动提交事务
defaultAutoCommit=true
#连接是否为只读连接
#Connection有一对方法,setReadOnly(boolean)和isReadOnly()
#如果是只读连接,那么只能用这个连接来做查询
#指定连接为只读是为了优化,这个优化与并发事务相关
defaultReadOnly=false
#指定事务的事务隔离级别
#可选值:NONE, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
#如果没有指定,那么由驱动中的Connection类自己来决定。
defaultTransactionIsolation=REPEATABLE_READ
——装饰设计模式
对象增强的手段:
1)继承
* 被增强的对象是固定的
* 增强的内容也是固定的
2)装饰设计模式
* 被增强的对象是可以切换的
* 增强的内容时固定的
3)动态代理
* 被增强的对象可以切换
* 增强的内容也可以切换
是你还有你,一切拜托你。
class MyConnection implements Connection { //是你
//还有你
private Connection conn; //底层对象,也是被增强对象
//通过构造器传递底层对象
public MyConnection(Connection conn){ //使用父类接口接受参数,保证能够接收任意参数
this.conn = conn;
}
//一切拜托你,表示使用底层对象来调用全部方法
public Statement createStatement() {
return conn.createStatement();
}
//被装饰(增强)方法
public void close() {
将当前连接归还给连接池,而不是关闭。
}
}
——C3P0连接池
C3P0是开源免费的连接池。
输出结果:com.mchange.v2.c3p0.impl.NewProxyConnection@6adca536
可以看到实现的是c3p3接口,并且创建了一个新的动态代理,而非装饰类。
——使用C3P0配置文件创建连接池
2、文件位置:必须在src目录下。
c3p0也可以指定配置文件,而且配置文件可以是properties,也可以是XML文件,当然,XML更高级一些。但是c3p0的配置文件名必须为c3p0-config.xml,并且必须放在类路径下。
配置文件信息:
程序代码:
——使用C3P0创建JDBCUtils
——Tomcat配置连接池
JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源。
这里要配置的资源当然是连接池了,这样项目中就可以通过统一的方式来获取连接池对象了。
2、下面的配置是Tomcat文档提供的:
配置JNDI资源需要到<Context>元素中配置<Resource>子元素:
* name:指定资源的名称,这个名称可以随便给,在获取资源时需要这个名称。
* factory:用来创建资源的工厂,这个值基本是固定的。
* type:资源的类型,我们要给出的类型当然是我们连接池的类型了。
用于生成该类的对象,例如“com.mchange.v2.c3p0.ComboPooledDataSource”。
/>
3、获取资源
配置资源的目的当然是为了获取资源,只要一启动Tomcat,那么就可以在项目中任何类中通过JNDI获取资源的方式来获取资源了。
与上面Tomcat文档提供的配置信息对应的获取资源代码如下:
Context cxt= new InitialContext();
Context envCxt = (Context)cxt.lookup("java:comp/env");
MyBean bean = (MyBean)envCxt.lookup("bean/MyBeanFactory");
Connection conn = bean.getConnection();
writer.print("foo = " + bean.getFoo() + ", bar = " + bean.getBar());
获取资源:
* Context:javax.naming.Context
* InitialContext:javax.naming.InitalContext
* lookup(String):获取资源的方法,其中“java:comp/env”是资源的入口(这是固定的名称),获取的对象是一个Context,这说明需要在获取到的Context上进一步进行获取。“bean/MyBeanFactory”对应<Resource>中配置的name的值,通过该name值获取到的就是资源对象了。
// 1、创建JNDI的上下文对象
JavaWeb之数据库连接池的更多相关文章
- JavaWeb基础—数据库连接池DBCP、C3P0
一.基本概念 数据库连接池负责分配.管理和释放数据库连接 数据库连接池:(池用map来实现居多) 用处:为了可重用(销毁创建麻烦,开销大)(招培训老师的例子) 二.编写实现数据库连接池 池参数: 初识 ...
- MVC设计模式((javaWEB)在数据库连接池下,实现对数据库中的数据增删改查操作)
设计功能的实现: ----没有业务层,直接由Servlet调用DAO,所以也没有事务操作,所以从DAO中直接获取connection对象 ----采用MVC设计模式 ----采用到的技术 .MVC设计 ...
- JavaWeb学习总结(十三)--数据库连接池
一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ...
- javaweb学习总结(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- 20160409 javaweb 数据库连接池
1.自己编写数据库连接池: package com.dzq.pool; import java.io.PrintWriter; import java.lang.reflect.InvocationH ...
- JavaWeb学习(三十)———— 数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- javaweb(三十九)——数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
- JavaWeb学习笔记(十七)—— 数据库连接池
一.数据库连接池概述 1.1 为什么使用数据库连接池 如果用户每次请求都向数据库获得连接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建1 ...
- javaweb基础(39)_数据库连接池
一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大 ...
随机推荐
- 两台Linux系统之间传输文件的几种方法
两台Linux系统之间传输文件的几种方法:参考https://www.cnblogs.com/bignode/articles/9241333.html
- deepin使用synergy鼠标越界软件实现和另一台windows系统共享鼠标
1,搜索synergy就能找到很多安装和配置的博客文章. 2,我遇到的问题: 1,在linux(deepin)上安装1.8.8版本报出找不到依赖libssl.so.1.0.0的错误,导致无法成功启动软 ...
- CSP-S 2020
游记 Day# 游记个鬼啊就在自家学校=-= 早上宿舍待不了,去机房颓废,看了几集猫和老鼠,并且把看门狗军团的流程看完了(真棒),甚至在考试之前把老师给的巧克力也吃完了. 期间zyt学长来摸鱼.他们今 ...
- IBM java开发面试题
1.commite在什么场合使用 svn 提交项目 数据库自动提交 Oracle手动,mysql自动 2.void(0)怎么使用 html界面 <a href="javaScript ...
- 用activiti实现类似钉钉审批流程-附整个系统源码
前言 目前市场上有很多开源平台没有整合工作流,即使有,也是价格不菲的商业版,来看这篇文章的估计也了解了行情,肯定不便宜.我这个快速开发平台在系统基础功能(用户管理,部门管理-)上整合了工作流,你可以直 ...
- tomcat与springmvc 结合 之---第16篇 servlet如何解析成员变量和DispatcherServlet如何解析
writedby 张艳涛,用了两个星期将深入刨析tomcat看完了,那么接下来该看什么呢?真是不知道,知识这东西上一个月看的jvm,锁.多线程并发 又都忘了.... tomcat学完,我打算看spri ...
- c++ 的父类 new 重载, 子类new 对象的时候会调用父类的operater new
子类在new 对象的 时候 父类的new 进行了重载,那么会调用父类的operater new() 函数 #include <iostream> #include <string& ...
- decimal和float的区别
场景 今天在开发的时候,在mongodb中有个字段保存的数据结构是decimal,然后需要对这个字段的值进行范围的查询.结果却怎么查询值范围都是空. 解决 如图中看到的,利用Navicat,可以明显的 ...
- GlassFish 任意文件读取漏洞
poc https://192.168.49.2:4848/theme/META-INF/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0 ...
- yum 卸载
# yum list installed | grep [软件名] #yum -y remove [软件名]