JavaWeb基础—数据库连接池DBCP、C3P0
一、基本概念
数据库连接池负责分配、管理和释放数据库连接
数据库连接池:(池用map来实现居多)
用处:为了可重用(销毁创建麻烦,开销大)(招培训老师的例子)
二、编写实现数据库连接池
池参数:
初识大小(招10个老师)
最小空闲连接数(小于3个时招人)
增量(一次创建的最小单位)(一次招5个)
最大空闲连接数(老师数多于12时销毁)
最大连接数(最大就招20人,超过也不招人了,等)
最大等待时间(等的时间太长没人归还就抛异常)
连接池也是通过四大参数以及相关jar包等
连接池一般不自己实现(那要崩溃,又不稳定)
使用commons-dbcp.jar(数据库连接池) 它依赖commons-pool.jar
(之前的io包,beanutils(依赖logging.jar包)等)commons被称为第二API
连接池必须实现javax.sql.DataSource接口(1.4开始的规范)通常使用无参的构造器
第三方的包都已经被实现,池参数都有默认值
但是!四大参数必须自己提供!
一般地,有两大开源的数据源实现:dbcp c3p0
步骤:
获得连接池对象(BasicDataSource)
设置四大参数
设置池参数
得到连接对象(close()方法是归还,不是销毁)
1.dbcp的小Demo(了解)
package com.commons.dbcptest; import java.sql.Connection;
import java.sql.SQLException; import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.Test; /**
* 用于测试commons的dbcp的类
* @author jiangbei01
*
*/
public class Demo02 {
@Test
public void fun1() throws SQLException{
/*
* 得到连接池对象
* 设置四大参数
* 设置池参数
* 得到连接对象
*/
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("root");
//使用的为默认池参数
Connection con = dataSource.getConnection();
System.out.println(con.getClass().getName());
//把连接归还给池
con.close();
}
}
2.c3p0 (大多开源项目的支持,JNDI的实现)
C3P0:
免费开源的数据库连接池,功能强大,性能优越,【推荐】
连接需要两个jar包(不需要oracal那个jar包)
ComboPooledDataSource为连接池对象,方法步骤与上大同小异!
C3P0可以有一个配置文件,但配置文件必须满足要求。可以使用使用命名配置
<named-config name="">
必须叫c3p0-config.xml
必须在src下
具体的配置见下图
配置文件模板
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<!--四大参数-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">root</property>
<!--池参数-->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">2</property>
<property name="maxPoolSize">5</property>
<property name="minPoolSize">2</property>
</default-config>
</c3p0-config>
使用连接池,重写JdbcUtils(day18)
这里做出一个简单的重写
package cn.itcast.jdbcutils; import java.sql.Connection;
import java.sql.SQLException; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JdbcUtils {
//使用的是默认的配置信息,注意给出c3p0-config.xml配置文件
private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
/**
* 大方一点,给出连接池对象给你
*/
public static ComboPooledDataSource getDataSource(){
return dataSource;
}
}
三、JNDI
JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
这 套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需 通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
JNDI(Java Naming and Directory Interface,Java命名和目录接口)
Tomcat配置数据库连接池(JNDI的手段来得资源)在tomcat/conf/catalina/localhost下创建与项目同名的xml配置文件
其它方法见百度
(百度的博客里的另外的方法)
1、在Web项目的WebRoot目录下的META-INF目录创建一个context.xml文件
2、在context.xml文件配置tomcat服务器的数据源
1 <Context>
2 <Resource
3 name="jdbc/datasource"
4 auth="Container"
5 type="javax.sql.DataSource"
6 username="root"
7 password="XDP"
8 driverClassName="com.mysql.jdbc.Driver"
9 url="jdbc:mysql://localhost:3306/jdbcstudy"
10 maxActive="8"
11 maxIdle="4"/>
12 </Context>
3、将数据库的驱动jar文件需放置在tomcat的lib下
4、在获取数据库连接的工具类(如jdbcUtils)的静态代码块中获取JNDI容器中的数据源
见孤傲苍狼大神的博客:http://www.cnblogs.com/xdp-gacl/p/4002804.html
采用之前的方式
,小的配置文件示例:
<Context>
<Resource name="jdbc/dataSource" auth="Container"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"/>
</Context>
name:资源名称,注意命名规范
auth:可不要
factory:固定,不要去变
type:类型,也就是c3p0包名
其他的东西都是资源的参数
获取资源的方法
Context iniCtx = new InitialContext();
Context envCtx = (Context)iniCtx.lookup("java:comp/env");//固定
//二次查找
//MyBean bean = (MyBean)envCtx.lookup("bean/MyBeanFactory");
writer.println("foo = "+bean.getFoo()+",bar = "+bean.getBar());
例如(注意在项目点lib下导包):
package cn.itcast.servlet; import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException; import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
/**
* 测试JNDI获取资源的Servlet,使用浏览器测试
* @author jiangbei01
*
*/
public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//获取上下文对象
Context iniCtx = new InitialContext();
//找出入口
Context envCtx = (Context)iniCtx.lookup("java:comp/env");
//二次查找,找到资源,里面的就是资源名
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/dataSource");
//于是就得到连接了,注意导包
try {
Connection con = dataSource.getConnection();
System.out.println(con);
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } catch (NamingException e) {
e.printStackTrace();
}
} }
JavaWeb基础—数据库连接池DBCP、C3P0的更多相关文章
- JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/beans)中建立数据库连接 2)进行sql操作 3)断开数据库连接 ...
- 【转】JDBC学习笔记(8)——数据库连接池(dbcp&C3P0)
转自:http://www.cnblogs.com/ysw-go/ JDBC数据库连接池的必要性 一.在使用开发基于数据库的web程序时,传统的模式基本是按一下步骤: 1)在主程序(如servlet/ ...
- java之数据库连接池-dbcp&c3p0&dbutils
介绍 因为数据库连接对象的创建比较消耗性能,所以可以在应用程序启动时就在内存中开辟一片空间(集合)存放多个数据库连接对象,后面需要连接时直接从该空间中取而不用新创建:使用完毕后归还连接(将连接重新放回 ...
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.BoneCP.Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDB ...
- java攻城狮之路--复习JDBC(数据库连接池 : C3P0、DBCP)
复习数据库连接池 : C3P0.DBCP 1.数据库连接池技术的优点: •资源重用: 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销.在减少系统消耗的基础上,另一方面也增 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- DataSource - 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
随机推荐
- 12.2Data Guard新特性--使用DBMS_DBCOMP.DBCOMP数据比较
Oracle Data Guard会主动对Hot数据(数据正被读取或修改)执行验证, 无论是primary还是standby,但对于那些Cold数据不会做任何检查和校验.所以在12.2版本 ...
- c# 托管和非托管的介绍
在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的 只是了解.net CLR如何做这些操作.也就是说 ...
- 使用CoreData [2]
使用CoreData [2] 此篇讲解CoreData处理关系型数据. 1. 先创建出Student于Teacher的实体. 2. 确定关系,并修改描述 3. 创建对象,并查看一下关系(Teacher ...
- linux 创建新用户并增加管理员权限
1.adduser与useradd有什么区别?2.那种方式会自动创建组.用户组等信息? 3.如何新建用户具有管理员权限? $是普通管员,#是系统管理员,root用户默认是没有密码的,因此也就无法使用( ...
- 关于for...in和for...of的思考
关于for...in和for...of的思考 在编写js代码的时候,我们经常性的要对数据集合进行遍历,Array.Object.以及ES6新属性Map.Set,甚至String类型都是可遍历的. 我们 ...
- Hadoop HA on Yarn——集群启动
这里分两部分,第一部分是NameNode HA,第二部分是ResourceManager HA (ResourceManager HA是hadoop-2.4.1之后加上的) NameNode HA 1 ...
- 基于easyui开发Web版Activiti流程定制器详解(二)——文件列表
上一篇我们介绍了目录结构,这篇给大家整理一个文件列表以及详细说明,方便大家查找文件. 由于设计器文件主要保存在wf/designer和js/designer目录下,所以主要针对这两个目录进行详细说明. ...
- Spring-IOC 在非 web 环境下优雅关闭容器
当我们设计一个程序时,依赖了Spring容器,然而并不需要spring的web环境时(Spring web环境已经提供了优雅关闭),即程序启动只需要启动Spring ApplicationContex ...
- 1050. [HAOI2006]旅行【并查集+枚举】
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最 ...
- Day2 CSS
什么是CSS 层叠样式表(cascading style sheet) 控制页面元素的显示方式.(添加样式) CSS语法 行间样式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现出C ...