Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。
一.连接池概述
1>.什么是连接池
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

2>.规范
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!常见的连接池:DBCP、C3P0。本篇博客的主角是DBCP连接池。
二.DBCP连接池
DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。如果我们想要使用它的功能的话,需要导入jar包,可以用Maven方式进行下载包,它可以帮我们解决一些依赖关系。Maven的使用请参考:http://www.cnblogs.com/yinzhengjie/p/9017416.html
1>.导入连接池jar包

2>.常见配置项
|
分类 |
属性 |
描述 |
|
必须项 |
driverClassName |
数据库驱动名称 |
|
url |
数据库的地址 |
|
|
username |
用户名 |
|
|
password |
密码 |
|
|
基本项(扩展) |
maxActive |
最大连接数量 |
|
minIdle |
最小空闲连接 |
|
|
maxIdle |
最大空闲连接 |
|
|
initialSize |
初始化连接 |
想要查看更详细的信息可参考DBCP的官网:http://commons.apache.org/proper/commons-dbcp/configuration.html
三.BasicDataSource类的使用
1>.准备数据库实验环境
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/
EMAIL:y1053419035@qq.com
*/ CREATE TABLE Teacher(
id INT PRIMARY KEY AUTO_INCREMENT,
Name varchar() COLLATE gbk_bin DEFAULT NULL,
Age int DEFAULT NULL,
Job varchar(),
JobDescription varchar()
);
2>.代码如下:
#@author :yinzhengjie
#Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
#EMAIL:y1053419035@qq.com
#
DriverName=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.0.254:5200/yinzhengjie?useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true
username=root
password=yinzhengjie
initialSize=
maxIdle=
minIdle=
maxActive=
yinzhengjie.properties 文件内容
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.note3; import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import java.util.ResourceBundle; /**
* 在dbcp连接池的jar中,有 一个定义好的BasicDataSource累,通过查看源码,发现该实现类已经帮我们实现类了数据源的规范接口,即javax.sql.DataSource
*/
public class JDBCUtils { //创建DataSource接口的实现类对象(BasicDataSource),我们的dbcp工具包已经帮我们实现好了,咱们直接用就好!
private static BasicDataSource dataSource = new BasicDataSource(); //定义数据库链接变量
private static final String DRIVERNAME;
private static final String URL;
private static final String USERNAME;
private static final String PASSWORD;
private static final int INITIALSIZE;
private static final int MAXIDLE;
private static final int MINLDEL;
private static final int MAXACTIVE; static {
//注意,我在Windows的配置文件全名是:“yinzhengjie.properties”,但是我们在给ResourceBundle的getBundle传参时应该注意两件事:第一,只传递文件名称并不传递文件后缀(即:yinzhengjie),第二,该文件应该在classpath中或者是跟包名在同一路径(即:在src目录中)
DRIVERNAME = ResourceBundle.getBundle("yinzhengjie").getString("DriverName");
URL = ResourceBundle.getBundle("yinzhengjie").getString("url");
USERNAME = ResourceBundle.getBundle("yinzhengjie").getString("username");
PASSWORD = ResourceBundle.getBundle("yinzhengjie").getString("password");
INITIALSIZE = Integer.parseInt( ResourceBundle.getBundle("yinzhengjie").getString("initialSize"));
MAXIDLE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxIdle"));
MINLDEL = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("minIdle"));
MAXACTIVE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxActive"));
} //静态代码块,对象BasicDataSource对象中的配置,自定义
static {
//链接数据库的4个最基本信息,通过对象的set方法进行设置如下:
dataSource.setDriverClassName(DRIVERNAME); //设置数据库驱动
dataSource.setUrl(URL); //设置访问数据库的路径
dataSource.setUsername(USERNAME); //设置登录数据库的用户名
dataSource.setPassword(PASSWORD); //设置登录数据库的密码 //对象连接池中的常见配置项,以下的四个配置可以不配置(因为有默认配置),但是上面的四个是必须要配置的!
dataSource.setInitialSize(INITIALSIZE); //指定初始化的连接数
dataSource.setMaxActive(MAXIDLE); //指定最大链接数量
dataSource.setMaxIdle(MINLDEL); //指定最大空闲数
dataSource.setMinIdle(MAXACTIVE); //指定最小空闲数
} //定义静态方法,返回BasicDataSource类的对象
public static DataSource getDataSource() {
return dataSource;
} }
JDBCUtils.java 文件内容
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.note3; import java.sql.SQLException;
import java.util.List;
import java.util.Map; import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler; public class QueryRunnerDemo {
//定义两个方法,实现数据表的添加,数据表查询,QueryRunner类对象,写在类成员位置
private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource()); public static void main(String[] args) {
// insert();
select();
} //数据表查询
private static void select() {
String sql = "SELECT * FROM Teacher where name = ?";
try {
String FirstArgs = "尹正杰";
List<Map<String, Object>> list = qr.query(sql, new MapListHandler(), FirstArgs);
//遍历集合list
for (Map<String, Object> map : list) {
for(String key :map.keySet()){
System.out.println(key + ": " + map.get(key) );
}
}
} catch (SQLException e) {
System.out.println(e);
throw new RuntimeException("数据查询失败!");
}
} //数据表添加数据
private static void insert() {
String sql = "INSERT INTO Teacher VALUES(null,?,?,?,?)";
Object[] params = {"尹正杰",,"高级云计算工程师","负责网站架构维护,维护上万台服务器正常运行!"}; try {
int row = qr.update(sql,params);
if(row != ) {
System.out.println("添加成功");
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("数据添加失败!");
}
}
}
Java基础-DBCP连接池(BasicDataSource类)详解的更多相关文章
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- Java基础-变量的定义以及作用域详解
Java基础-变量的定义以及作用域详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字面量 常量(字面量)表示不能改变的数值(程序中直接出现的值).字面量有时也称为直接量,包 ...
- java使用DBCP连接池创建工具类
1.说明 java中有个扩展包 javax下面有个DataResource的接口 javax.sql.DataResource 该接口定义了连接池的方法规范 而DBCP框架有apache公司开发,他 ...
- java 复习整理(四 String类详解)
String 类详解 StringBuilder与StringBuffer的功能基本相同,不同之处在于StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此效率上S ...
- Java自带线程池和队列详解
Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后 ...
- 数据库阿里连接池 Druid配置详解以及web监控统计
java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色的性能,也 ...
- Java学习笔记 线程池使用及详解
有点笨,参考了好几篇大佬们写的文章才整理出来的笔记.... 字面意思上解释,线程池就是装有线程的池,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程 ...
- 三:Redis连接池、JedisPool详解、Redisi分布式
单机模式: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; ...
随机推荐
- 20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 结对伙伴博客链接 刘辰同学对编程的积极程度很高,并且在编程能力上很不错,有 ...
- YQCB冲刺周第五天
站立会议: 任务看板: 今天的任务为依旧为将用户记录的数据添加到数据库中,以及金额球的设置. 遇到的问题为金额球在jsp页面的显示.
- c# 写文件注意问题及用例展示
以txt写string举例,正确代码如下: private void xie() { FileStream fs = new FileStream("1.txt", FileMod ...
- Task 6.2冲刺会议七 /2015-5-20
今天把主界面改善了一下,主要功能时摄像头的使用以及语音聊天的部分,两个部分的设计原理基本相同,但是可是好几个模块让有点不知道该怎么下手.这时候我感觉到了模块拼接是很困难的,只有十分清楚每个模块才能很好 ...
- static 继承
静态方法大家应该都比较熟悉,在这里主要谈一下静态方法在继承时的一些注意事项. 1.父类方法如果是静态方法,子类不能覆盖为非静态方法: 2.父类方法如果是非静态方法,子类不能覆盖为静态方法: 3.父类静 ...
- Java 面试 --- 3
上一篇,我们给出了大概35个题目,都是基础知识,有童鞋反映题目过时了,其实不然,这些是基础中的基础,但是也是必不可少的,面试题目中还是有一些基础题目的,我们本着先易后难的原则,逐渐给出不同级别的题目, ...
- Leetcode题库——34.在排序数组中国查找元素的第一个和最后一个位置
@author: ZZQ @software: PyCharm @file: searchRange.py @time: 2018/11/12 19:19 要求:给定一个按照升序排列的整数数组 num ...
- 用原生JS实现多张图片上传及预览功能(兼容IE8)
最近需要做一个图片上传预览的功能(兼容IE8-11.chrome.firefox等浏览器),网上现有的文件上传组件(如webuploader)总是会遇到一些兼容性问题.于是我参考了一些博文(链接找不到 ...
- 韩剧TV APP案例分析
产品 选择产品:韩剧TV 版本:Android版 选择理由:节假日坐车回家时使用较多次数的APP,刚好国庆坐车回家时正在使用,所以选择了这款APP. 第一部分:调研.评测 第一次上手体验 刚打开APP ...
- keil51下使用sprintf问题
测试环境:keil c51 + STC89C52说明: 1.keil的不定参数只有15个字节也就是说sizeof(...) 加起来总共不能超过15字节,否则会出错 2.当不定参数中有常数时,你也会得不 ...