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 {@Testpublic 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();}}}
转载于:https://www.cnblogs.com/jiangbei/p/6701414.html
JavaWeb基础—数据库连接池DBCP、C3P0相关推荐
- javaweb mysql 连接池 c3p0 配置_JavaWeb基础—数据库连接池DBCP、C3P0
一.基本概念 数据库连接池负责分配.管理和释放数据库连接 数据库连接池:(池用map来实现居多) 用处:为了可重用(销毁创建麻烦,开销大)(招培训老师的例子) 二.编写实现数据库连接池 池参数: 初识 ...
- javaweb使用 数据库连接池 DBCP,实现对数据库驱动使用优化,多个 action共用一个数据库连接
本文着重理解DBCP以及连接池基本运行原理(步骤) 首先我们要知道在连接数据库时 如果频繁的对数据库进行连接,然后又将它释放,对项目的访问效率是一种绝对的降低, 因为在这个过程中,连接(校验密码用户名 ...
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
http://developer.51cto.com/art/201807/579402.htm 主流数据库连接池 常用的主流开源数据库连接池有C3P0.DBCP.Tomcat Jdbc Pool.B ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
转载自 常用数据库连接池 (DBCP.c3p0.Druid) 配置说明 1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的 ...
- 数据库连接池 (DBCP、c3p0、Druid) 配置说明和对比
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出. 对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据 ...
- Java数据库连接池--DBCP浅析
转载自 Java数据库连接池--DBCP浅析 前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用 ...
- mysql dbcp 配置文件_数据库连接池DBCP使用方式
数据库连接池DBCP使用方式 概念 开源数据源实现,使用这些数据库连接池后,我们在项目开发中就不需要编写连接数据库的代码了. 开源数据源包含DBCP.C3P0.Druid等 DBCP Java使用实例 ...
- 数据库连接池 DBCP和c3p0数据库连接池
一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每次请求 ...
- 数据库连接池——DBCP连接池o
DBCP 1.什么是DBCP? DBCP是Apache提供的一款开源免费的数据库连接池! Hibernate3.0之后不再对DBCP提供支持!因为Hibernate声明DBCP有致命的缺欠!DBCP因 ...
最新文章
- XingXingMVC页面跳转处理
- 【数字信号处理】周期序列 ( 周期序列定义 | 周期序列示例 )
- (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)
- 【论文解读】CVPR 2021 | 旷视提出GID:用于目标检测的通用实例蒸馏
- python写xml文件_用python写xml文件
- [Unity3d]Unity Mathf 数学运算(C#)
- C#设计模式-单例模式
- iOS开发之适配http请求
- 关于input type=hidden/标签的记录
- 基于react做了一个仿qq空间
- 用html语言写一个环形,html5环形流程图可添加流程图代码
- linux模拟http请求命令
- 关于 HSF框架 (一)简单介绍
- Latex表格排版大全 基于 IEEE双栏论文(设置单元格行列间距,自动换行设置)
- Python 批量转换视频音频采样率(附代码) | Python工具
- 什么是搜索引擎优化(SEO)
- 07-微信小程序商城 精品推荐(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
- 6SE70变频器自由功能块定义
- Excel中比vlookup函数还要好用的自动填表功能
- 开发小程序需要服务器吗?小程序服务器配置有什么要求?
热门文章
- Linux属于下面哪一种软件,【单选题】下面软件中属于自由软件开放源码的是( )。
A. Unix B. Linux C. Mi...
- java listmode_java中图形界面ListModel的用法?方法如何调用?
- Matlab中*和.*区别
- 堆(heap)与栈(stack)的区别(二)
- Pycharm如何设置自定义背景颜色
- 无线通信信号自由空间损耗
- AXI4-Stream协议总结
- opencv-python视频处理之图片变成视频,视频切成图片
- 五花八门的Shell 的相关概念和配置方法
- virtualbox+vagrant学习-2(command cli)-16-vagrant snapshot命令