数据库连接池
数据库连接池
1、为什么要使用数据库连接池?
数据库创建连接通常需要消耗相对较大的资源
数据库关闭连接也可能存在不及时的情况
数据库资源有限,会出现连接数已经达到最大连接数或者,内存溢出等问题
2、数据库连接池的原理的是什么?什么是数据库连接池? ---- 实现了连接重用!!
未使用数据库连接池,DAO将从数据库直接获取连接
使用了连接池后,会一次性创建多个连接,构成连接池,DAO将从池中获取连接
注意事项:不需要直接通过数据库获取连接、当连接关闭时,将连接归还数据库连接池
编写连接池
1、LinkedList 存放了 10个Connection
2、在获取连接时候,你可以模拟一个队列或者栈结构
每次用户需要连接时,从池中移除一个给用户
思考:连接都被占用了,怎么办???
3、调用connection的close方法,只会关闭连接,不会将连接存回池中??
修改原来Connection的close方法 ------ 对close进行扩展!
在java中怎么把一个方法扩展?? ---- 继承覆盖、组合复用(装饰模式、代理模式)
面向对象设计原则:5个 ---- OCP 对修改关闭,对扩展开放
关闭时:需要将连接存回连接池!
**代理技术、类加载器(ClassLoader)
Apache commons 项目--> Apache Commons项目的由三部分组成:
The Commons Proper - 一个可重用的Java组件库。(已经发布过的)
The Commons Sandbox - Java组件开发工作区. (正在开发的项目)
The Commons Dormant - 当前处于非活动状态的组件库.(刚启动或者已经停止维护的项目)
建立和维护可重用的Java组件。使用组件可以提高开发效率和质量。
commons-beanutils
commons-fileupload
commons-dbcp 依赖于另一个项目 commons-pool
commons-logging
DBCP:Database connection pool
在使用连接池时,配置参数的名字都是固定的
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day11
username=root
password=123
C3P0 来自于Java开源社区 (Spring、Hibernate)
C3P0配置有多种方式
1、直接在DataSource里面进行设置
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 手动设置连接参数
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/day11");
dataSource.setUser("root");
dataSource.setPassword("123");
2、c3p0-config.xml
//初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 initialPoolSize
ds.setInitialPoolSize(3);
//连接池中保留的最大连接数。Default: 15 maxPoolSize
ds.setMaxPoolSize(10);
//// 连接池中保留的最小连接数。
//ds.setMinPoolSize(1);
//当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 acquireIncrement
ds.setAcquireIncrement(10);
//最大空闲时间,25000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 maxIdleTime
ds.setMaxIdleTime(25000);
配置tomcat连接池
全局的
1、server.xml
2、context.xml
具体某个应用
3、配置自定义虚拟目录xml
配置到<Context>内部
配置过程
1、<Resource>
<Resource name="jdbc/day11" auth="Container"
type="javax.sql.DataSource" username="root" password="123"
driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/day11"
maxActive="8" maxIdle="4"/>
* name : jdbc/不动,后面那个名称可以随意
2、驱动jar 必须放入tomcat的lib
当你使用c3p0或者dbcp的时候,连接池仍是你自己创建的
当使用tomcat连接池,连接池是不是由tomcat创建,tomcat创建连接的过程中需要驱动jar
3、在你的应用程序中,获取连接 通过JNDI
// 通过JNDI的方式,查找Tomcat的连接池
Context initCtx = new InitialContext();
// JNDI 进行Java资源访问时,固定编写的
Context envCtx = (Context) initCtx.lookup("java:comp/env");
// 查找自定义连接池
DataSource dataSource = (DataSource) envCtx.lookup("jdbc/day11");
**对于使用tomcat连接池,大多用在web工程里,将JNDI代码写到Servlet或者JSP中!!!!!!
JNDI(Java Naming and Directory Interface)
Java命名和目录接口,它对应于J2SE中的javax.naming包,
这套API的主要作用在于:
它可以把Java对象放在一个容器中(JNDI容器),
并为容器中的java对象取一个名称,
以后程序想获得Java对象,只需通过名称检索即可。
其核心API为Context,它代表JNDI容器,
其lookup方法为检索容器中对应名称的对象。