JDBC学习笔记(19):标准DataSource接口及开源项目DBCP简单使用

  • DataSource用来取代DriverManager来获取Connection
  • 通过DataSource获得Connection速度很快
  • 通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改。
  • 一般DataSource内部会用一个连接池来缓存Connection,这样可以大幅度提高数据库的访问速度
  • 连接池可以理解成一个能够存放Connection的Connection
  • 程序只和DataSource打交道,不会直接访问连接池
 1 package com.xxyh.jdbc.datasource;
 2 import java.io.PrintWriter;
 3 import java.sql.Connection;
 4 import java.sql.SQLException;
 5 import java.sql.SQLFeatureNotSupportedException;
 6 import java.util.logging.Logger;
 7 import javax.sql.DataSource;
 8 public class DataSource3 implements DataSource {
 9     @Override
10     public PrintWriter getLogWriter() throws SQLException {
11         // TODO Auto-generated method stub
12         return null;
13     }
14     @Override
15     public void setLogWriter(PrintWriter out) throws SQLException {
16         // TODO Auto-generated method stub
17     }
18     @Override
19     public void setLoginTimeout(int seconds) throws SQLException {
20         // TODO Auto-generated method stub
21     }
22     @Override
23     public int getLoginTimeout() throws SQLException {
24         // TODO Auto-generated method stub
25         return 0;
26     }
27     @Override
28     public Logger getParentLogger() throws SQLFeatureNotSupportedException {
29         // TODO Auto-generated method stub
30         return null;
31     }
32     @Override
33     public <T> T unwrap(Class<T> iface) throws SQLException {
34         // TODO Auto-generated method stub
35         return null;
36     }
37     @Override
38     public boolean isWrapperFor(Class<?> iface) throws SQLException {
39         // TODO Auto-generated method stub
40         return false;
41     }
42     @Override
43     public Connection getConnection() throws SQLException {
44         // TODO Auto-generated method stub
45         return null;
46     }
47     @Override
48     public Connection getConnection(String username, String password)
49             throws SQLException {
50         // TODO Auto-generated method stub
51         return null;
52     }
53 }

首先导入三个jar包:commons-dbcp.jar、commons-collections.jar、commons-pool.jar

配置文件dbcpconfig.properties:

 1 driverClassName=com.mysql.jdbc.Driver
 2 url=jdbc:mysql://localhost:3306/jdbc
 3 username=root
 4 password=1234
 5 initialSize=10
 6 maxActive=50
 7 maxIdle=20
 8 minIdle=5
 9 maxWait=60000
10 connectionProperties=useUnicode=true;characterEncoding=gbk
11 defaultAutoCommit=true
12 defaultReadOnly=
13 defaultTransactionIsolation=READ_UNCOMMITTED

修改JdbcUtils.java:

 1 package com.xxyh.jdbc;
 2 import java.io.InputStream;
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 import java.util.Properties;
 8 import javax.sql.DataSource;
 9 import org.apache.commons.dbcp.BasicDataSourceFactory;
10 public class JdbcUtils {
11     private static DataSource myDataSource = null;
12
13     private JdbcUtils() {
14     }
15
16     static {
17         try {
18             // 将注册驱动放在静态代码块中只需执行一次
19             Class.forName("com.mysql.jdbc.Driver");
20 //            myDataSource = new MyDataSource2();
21             Properties prop = new Properties();
22             InputStream is = JdbcUtils.class.getClassLoader()
23                     .getResourceAsStream("dbcpconfig.properties");
24             prop.load(is);
25             myDataSource = BasicDataSourceFactory.createDataSource(prop);
26         } catch(Exception e) {
27             throw new ExceptionInInitializerError(e);
28         }
29     }
30
31     public static Connection getConnection() throws SQLException {
32 //        return DriverManager.getConnection(url, user, password);
33         // 当需要连接的时候,不再创建,而是从连接池中获取
34         return myDataSource.getConnection();
35     }
36
37     public static void close(ResultSet rs, Statement stmt, Connection conn) {
38         try {
39             if (rs != null) {
40                 rs.close();
41             }
42         } catch (SQLException e) {
43             e.printStackTrace();
44         } finally {
45             try {
46                 if (stmt != null) {
47                     stmt.close();
48                 }
49             } catch (SQLException e) {
50                 e.printStackTrace();
51             } finally {
52                 if (conn != null) {
53                     try {
54                         conn.close();
55                         // 将连接放回连接池,而不是关闭连接
56 //                        myDataSource.free(conn);
57                     } catch (Exception e) {
58                         e.printStackTrace();
59                     }
60                 }
61             }
62         }
63     }
64 }

测试:

 1 package com.xxyh.jdbc;
 2 import java.sql.Connection;
 3 import java.sql.DriverManager;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 public class Base {
 8     public static void main(String[] args) throws ClassNotFoundException, SQLException {
 9         //test();
10 //        template();
11         for (int i = 0; i < 5; i++) {
12             Connection conn = JdbcUtils.getConnection();
13             System.out.println(conn.getClass().getName());
14             JdbcUtils.close(null, null, conn);
15         }
16     }
17 }

【运行结果】:

org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper

时间: 2024-10-13 07:12:58

JDBC学习笔记(19):标准DataSource接口及开源项目DBCP简单使用的相关文章

python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列

标准库:一些最爱 集合.堆和双端队列 集合 集合Set类位于sets模块中. >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> set(range(10)) set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 集合是由序列(或其他可迭代的对象)构建的.主要用于检查成员资格,因此,副本是被忽略的: >>> range(10)*2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9

[学习笔记] Python标准库简明教程 [转]

1 操作系统接口 os 模块提供了一系列与系统交互的模块: >>> os.getcwd() # Return the current working directory '/home/minix/Documents/Note/Programming/python/lib1' >>> os.chdir('~/python') # Change current working directory Traceback (most recent call last): File

[学习笔记] Python标准库的学习准备 [转]

Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU,磁盘存储以及IO的功能和性能,了解计算机工作的流程,了解指令的概念.这些内容基础而重要. Python标准库的一部份是为了提高系统的性能(比如mmap),所以有必要了解基本的计算机各个组成部分的性能. 操作系统 在了解操作系统时,下面是重点: 1) 操作系统的进程管理,比如什么是UID, PID, daemon 2) 进程之间

springmvc学习笔记(19)-RESTful支持

springmvc学习笔记(19)-RESTful支持 springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控制器配置 对静态资源的解析 本文介绍RESTful的概念,并通过一个小样例展示怎样编写RESTful风格的controller和配置前端控制器,最后展示静态资源的解析 概念 首先附上两篇博客链接 理解RESTful架构 - 阮一峰的网络日志 RESTful API 设计指南- 阮一峰的网络日志 RESTful架构.就是眼下最流

JDBC学习笔记(一)

public static void main(String[] args) { ResultSet rs = null; Statement stmt = null; Connection conn = null; try { /** * 1.加载JDBC驱动程序: * 加载目标数据库驱动到JVM * 成功加载后,会将Driver类的实例注册到DriverManager类 * oracle-Driver:oracle.jdbc.driver.OracleDriver * MySQL-Drive

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

树莓派学习笔记——使用标准PC104键盘

0 前言 本文将详细介绍树莓派的键盘设计.和多数的人的想法不同,世界上存在着各种各样不同的键盘,中国人使用的键盘和美国人使用的键盘相同,而树莓派源产自英国,英国的键盘和美国并不相同.国内多使用标准104键键盘,下面就讲讲如何配置. [相关博文] [树莓派学习笔记--索引博文]--更多博文请关注. 1 PC104标准键盘 [wiki百科]--IBM PC keyboard 所谓PC104标准键盘是指键盘含有104个按键,国内和美国多使用该类型键盘,而欧洲大陆多使用PC105键盘,除了比PC104键

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾