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>.准备数据库实验环境
1 /*
2 @author :yinzhengjie
3 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/
4 EMAIL:y1053419035@qq.com
5 */
6
7 CREATE TABLE Teacher(
8 id INT PRIMARY KEY AUTO_INCREMENT,
9 Name varchar(30) COLLATE gbk_bin DEFAULT NULL,
10 Age int DEFAULT NULL,
11 Job varchar(50),
12 JobDescription varchar(100)
13 );
2>.代码如下:
1 #@author :yinzhengjie
2 #Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
3 #EMAIL:y1053419035@qq.com
4 #
5 DriverName=com.mysql.jdbc.Driver
6 url=jdbc:mysql://192.168.0.254:5200/yinzhengjie?useServerPrepStmts=true&cachePrepStmts=true&rewriteBatchedStatements=true
7 username=root
8 password=yinzhengjie
9 initialSize=10
10 maxIdle=5
11 minIdle=3
12 maxActive=1
1 /*
2 @author :yinzhengjie
3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
4 EMAIL:y1053419035@qq.com
5 */
6 package cn.org.yinzhengjie.note3;
7
8 import javax.sql.DataSource;
9 import org.apache.commons.dbcp.BasicDataSource;
10 import java.util.ResourceBundle;
11
12 /**
13 * 在dbcp连接池的jar中,有 一个定义好的BasicDataSource累,通过查看源码,发现该实现类已经帮我们实现类了数据源的规范接口,即javax.sql.DataSource
14 */
15 public class JDBCUtils {
16
17 //创建DataSource接口的实现类对象(BasicDataSource),我们的dbcp工具包已经帮我们实现好了,咱们直接用就好!
18 private static BasicDataSource dataSource = new BasicDataSource();
19
20 //定义数据库链接变量
21 private static final String DRIVERNAME;
22 private static final String URL;
23 private static final String USERNAME;
24 private static final String PASSWORD;
25 private static final int INITIALSIZE;
26 private static final int MAXIDLE;
27 private static final int MINLDEL;
28 private static final int MAXACTIVE;
29
30 static {
31 //注意,我在Windows的配置文件全名是:“yinzhengjie.properties”,但是我们在给ResourceBundle的getBundle传参时应该注意两件事:第一,只传递文件名称并不传递文件后缀(即:yinzhengjie),第二,该文件应该在classpath中或者是跟包名在同一路径(即:在src目录中)
32 DRIVERNAME = ResourceBundle.getBundle("yinzhengjie").getString("DriverName");
33 URL = ResourceBundle.getBundle("yinzhengjie").getString("url");
34 USERNAME = ResourceBundle.getBundle("yinzhengjie").getString("username");
35 PASSWORD = ResourceBundle.getBundle("yinzhengjie").getString("password");
36 INITIALSIZE = Integer.parseInt( ResourceBundle.getBundle("yinzhengjie").getString("initialSize"));
37 MAXIDLE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxIdle"));
38 MINLDEL = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("minIdle"));
39 MAXACTIVE = Integer.parseInt(ResourceBundle.getBundle("yinzhengjie").getString("maxActive"));
40 }
41
42 //静态代码块,对象BasicDataSource对象中的配置,自定义
43 static {
44 //链接数据库的4个最基本信息,通过对象的set方法进行设置如下:
45 dataSource.setDriverClassName(DRIVERNAME); //设置数据库驱动
46 dataSource.setUrl(URL); //设置访问数据库的路径
47 dataSource.setUsername(USERNAME); //设置登录数据库的用户名
48 dataSource.setPassword(PASSWORD); //设置登录数据库的密码
49
50 //对象连接池中的常见配置项,以下的四个配置可以不配置(因为有默认配置),但是上面的四个是必须要配置的!
51 dataSource.setInitialSize(INITIALSIZE); //指定初始化的连接数
52 dataSource.setMaxActive(MAXIDLE); //指定最大链接数量
53 dataSource.setMaxIdle(MINLDEL); //指定最大空闲数
54 dataSource.setMinIdle(MAXACTIVE); //指定最小空闲数
55 }
56
57 //定义静态方法,返回BasicDataSource类的对象
58 public static DataSource getDataSource() {
59 return dataSource;
60 }
61
62 }
1 /*
2 @author :yinzhengjie
3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
4 EMAIL:y1053419035@qq.com
5 */
6 package cn.org.yinzhengjie.note3;
7
8 import java.sql.SQLException;
9 import java.util.List;
10 import java.util.Map;
11
12 import org.apache.commons.dbutils.QueryRunner;
13 import org.apache.commons.dbutils.handlers.ArrayListHandler;
14 import org.apache.commons.dbutils.handlers.MapListHandler;
15
16 public class QueryRunnerDemo {
17 //定义两个方法,实现数据表的添加,数据表查询,QueryRunner类对象,写在类成员位置
18 private static QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
19
20 public static void main(String[] args) {
21 // insert();
22 select();
23 }
24
25 //数据表查询
26 private static void select() {
27 String sql = "SELECT * FROM Teacher where name = ?";
28 try {
29 String FirstArgs = "尹正杰";
30 List<Map<String, Object>> list = qr.query(sql, new MapListHandler(), FirstArgs);
31 //遍历集合list
32 for (Map<String, Object> map : list) {
33 for(String key :map.keySet()){
34 System.out.println(key + ": " + map.get(key) );
35 }
36 }
37 } catch (SQLException e) {
38 System.out.println(e);
39 throw new RuntimeException("数据查询失败!");
40 }
41 }
42
43 //数据表添加数据
44 private static void insert() {
45 String sql = "INSERT INTO Teacher VALUES(null,?,?,?,?)";
46 Object[] params = {"尹正杰",26,"高级云计算工程师","负责网站架构维护,维护上万台服务器正常运行!"};
47
48 try {
49 int row = qr.update(sql,params);
50 if(row != 0) {
51 System.out.println("添加成功");
52 }
53 } catch (SQLException e) {
54 e.printStackTrace();
55 throw new RuntimeException("数据添加失败!");
56 }
57 }
58 }