From 12d488204f29621e78c42333cdac4db9d5c4fba5 Mon Sep 17 00:00:00 2001 From: ZhangZiSheng001 <18826241741@163.com> Date: Wed, 25 Mar 2020 10:00:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 ++++------ src/main/java/cn/zzs/dbcp/JDBCUtils.java | 50 ------------------- .../java/cn/zzs/dbcp/BasicDataSourceTest.java | 46 +++++++---------- 3 files changed, 27 insertions(+), 94 deletions(-) diff --git a/README.md b/README.md index 962d943..093f5c6 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ * [主要步骤](#主要步骤) * [创建项目](#创建项目) * [引入依赖](#引入依赖) - * [编写`dbcp.prperties`](#编写dbcpprperties) + * [编写dbcp.prperties](#编写dbcpprperties) * [获取连接池和获取连接](#获取连接池和获取连接) * [编写测试类](#编写测试类) * [配置文件详解](#配置文件详解) @@ -50,7 +50,6 @@ - # 简介 `DBCP`用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他连接池一样,也具有连接数控制、连接有效性检测、连接泄露控制、缓存语句等功能。目前,`tomcat`自带的连接池就是`DBCP`,Spring开发组也推荐使用`DBCP`,阿里的`druid`也是参照`DBCP`开发出来的。 @@ -130,7 +129,7 @@ ``` -## 编写`dbcp.prperties` +## 编写dbcp.prperties 路径`resources`目录下,因为是入门例子,这里仅给出数据库连接参数和连接池基本参数,后面源码会对配置参数进行详细说明。另外,数据库`sql`脚本也在该目录下。 @@ -167,7 +166,7 @@ maxWaitMillis=-1 ## 获取连接池和获取连接 -项目中编写了`JDBCUtils`来初始化连接池、获取连接、管理事务和释放资源等,具体参见项目源码。 +项目中编写了`JDBCUtils`来初始化连接池、获取连接和释放资源等,具体参见项目源码。 路径:`cn.zzs.dbcp` ```java @@ -187,7 +186,7 @@ maxWaitMillis=-1 ```java @Test - public void save() { + public void save() throws SQLException { // 创建sql String sql = "insert into demo_user values(null,?,?,?,?,?)"; Connection connection = null; @@ -196,7 +195,7 @@ maxWaitMillis=-1 // 获得连接 connection = JDBCUtils.getConnection(); // 开启事务设置非自动提交 - JDBCUtils.startTrasaction(); + connection.setAutoCommit(false); // 获得Statement对象 statement = connection.prepareStatement(sql); // 设置参数 @@ -208,10 +207,7 @@ maxWaitMillis=-1 // 执行 statement.executeUpdate(); // 提交事务 - JDBCUtils.commit(); - } catch(Exception e) { - JDBCUtils.rollback(); - log.error("保存用户失败", e); + connection.commit(); } finally { // 释放资源 JDBCUtils.release(connection, statement, null); @@ -463,7 +459,7 @@ accessToUnderlyingConnectionAllowed=false 研究之前,先来看下`BasicDataSource`的`UML`图: -BasicDataSource的UML图 +![BasicDataSource的UML图](https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171436263-280030888.png) 这里介绍下这几个类的作用: @@ -517,7 +513,7 @@ accessToUnderlyingConnectionAllowed=false if(dataSource != null) { return dataSource; } - // 注册MBean,用于支持JMX,这方面的内容不在这里扩展,相关内容可阅读我的另一篇博客:深入理解JMX + // 注册MBean,用于支持JMX,这方面的内容不在这里扩展 jmxRegister(); // 创建原生Connection工厂:本质就是持有数据库驱动对象和几个连接参数 @@ -553,8 +549,7 @@ accessToUnderlyingConnectionAllowed=false ``` 以上方法涉及到几个类,这里再补充下`UML`图。 -GenericObjectPool的UML图 - +![GenericObjectPool的UML图](https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171502877-1140170931.png) | 类名 | 描述 | | --------------------------- | ------------------------------------------------------------ | @@ -566,7 +561,7 @@ accessToUnderlyingConnectionAllowed=false 上面已经大致分析了数据源和连接池对象的获取过程,接下来研究下连接对象的获取。在此之前先了解下`DBCP`中几个`Connection`实现类。 -DelegatingConnection的UML图 +![DelegatingConnection的UML图](https://img2018.cnblogs.com/blog/1731892/201912/1731892-20191228171525594-1114346897.png) 类名|描述 -|- diff --git a/src/main/java/cn/zzs/dbcp/JDBCUtils.java b/src/main/java/cn/zzs/dbcp/JDBCUtils.java index e66f085..2a91b7d 100644 --- a/src/main/java/cn/zzs/dbcp/JDBCUtils.java +++ b/src/main/java/cn/zzs/dbcp/JDBCUtils.java @@ -89,56 +89,6 @@ public class JDBCUtils { } } - /** - * - *

开启事务

- * @author: zzs - * @date: 2019年11月3日 上午11:03:24 - * @return: void - * @throws Exception - */ - public static void startTrasaction() throws SQLException { - getConnection().setAutoCommit(false); - } - - /** - * - *

提交事务

- * @author: zzs - * @date: 2019年11月3日 上午11:05:54 - * @return: void - */ - public static void commit() { - Connection connection = tl.get(); - if(connection != null) { - try { - connection.commit(); - connection.setAutoCommit(true); - } catch(SQLException e) { - log.error("提交事务失败", e); - } - } - } - - /** - * - *

回滚事务

- * @author: zzs - * @date: 2019年11月3日 上午11:08:12 - * @return: void - */ - public static void rollback() { - Connection connection = tl.get(); - if(connection != null) { - try { - connection.rollback(); - connection.setAutoCommit(true); - } catch(SQLException e) { - log.error("回滚事务失败", e); - } - } - } - /** * *

创建数据库连接

diff --git a/src/test/java/cn/zzs/dbcp/BasicDataSourceTest.java b/src/test/java/cn/zzs/dbcp/BasicDataSourceTest.java index 21e633a..97322a0 100644 --- a/src/test/java/cn/zzs/dbcp/BasicDataSourceTest.java +++ b/src/test/java/cn/zzs/dbcp/BasicDataSourceTest.java @@ -6,24 +6,21 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.junit.Test; /** - * @Description: 测试使用BasicDataSource获取连接并操作数据库 + *

测试使用BasicDataSource获取连接并操作数据库

* @author: zzs * @date: 2019年8月31日 下午9:39:54 */ public class BasicDataSourceTest { - private static final Log log = LogFactory.getLog(BasicDataSourceTest.class); - /** - * 测试添加用户 + *

测试添加用户

+ * @throws SQLException */ @Test - public void save() { + public void save() throws SQLException { // 创建sql String sql = "insert into demo_user values(null,?,?,?,?,?)"; Connection connection = null; @@ -32,7 +29,7 @@ public class BasicDataSourceTest { // 获得连接 connection = JDBCUtils.getConnection(); // 开启事务设置非自动提交 - JDBCUtils.startTrasaction(); + connection.setAutoCommit(false); // 获得Statement对象 statement = connection.prepareStatement(sql); // 设置参数 @@ -44,10 +41,7 @@ public class BasicDataSourceTest { // 执行 statement.executeUpdate(); // 提交事务 - JDBCUtils.commit(); - } catch(Exception e) { - JDBCUtils.rollback(); - log.error("保存用户失败", e); + connection.commit(); } finally { // 释放资源 JDBCUtils.release(connection, statement, null); @@ -55,10 +49,11 @@ public class BasicDataSourceTest { } /** - * 测试更新用户 + *

测试更新用户

+ * @throws SQLException */ @Test - public void update() { + public void update() throws SQLException { // 创建sql String sql = "update demo_user set age = ?,gmt_modified = ? where name = ?"; Connection connection = null; @@ -67,7 +62,7 @@ public class BasicDataSourceTest { // 获得连接 connection = JDBCUtils.getConnection(); // 开启事务 - JDBCUtils.startTrasaction(); + connection.setAutoCommit(false); // 获得Statement对象 statement = connection.prepareStatement(sql); // 设置参数 @@ -77,10 +72,7 @@ public class BasicDataSourceTest { // 执行 statement.executeUpdate(); // 提交事务 - JDBCUtils.commit(); - } catch(Exception e) { - log.error("异常导致操作回滚", e); - JDBCUtils.rollback(); + connection.commit(); } finally { // 释放资源 JDBCUtils.release(connection, statement, null); @@ -88,10 +80,11 @@ public class BasicDataSourceTest { } /** - * 测试查找用户 + *

测试查找用户

+ * @throws SQLException */ @Test - public void findAll() { + public void findAll() throws SQLException { // 创建sql String sql = "select * from demo_user where deleted = false"; Connection connection = null; @@ -110,8 +103,6 @@ public class BasicDataSourceTest { int age = resultSet.getInt(3); System.out.println("用户名:" + name + ",年龄:" + age); } - } catch(SQLException e) { - log.error("查询用户异常", e); } finally { // 释放资源 JDBCUtils.release(connection, statement, resultSet); @@ -119,7 +110,7 @@ public class BasicDataSourceTest { } /** - * 测试删除用户 + *

测试删除用户

*/ @Test public void delete() throws Exception { @@ -131,7 +122,7 @@ public class BasicDataSourceTest { // 获得连接 connection = JDBCUtils.getConnection(); // 设置非自动提交 - JDBCUtils.startTrasaction(); + connection.setAutoCommit(false); // 获得Statement对象 statement = connection.prepareStatement(sql); // 设置参数 @@ -139,10 +130,7 @@ public class BasicDataSourceTest { // 执行 statement.executeUpdate(); // 提交事务 - JDBCUtils.commit(); - } catch(Exception e) { - log.error("异常导致操作回滚", e); - JDBCUtils.rollback(); + connection.commit(); } finally { // 释放资源 JDBCUtils.release(connection, statement, null);