JDBC概述三(批处理+事务操作+数据库连接池)

news2024/11/9 10:45:25

一(批处理)

1.1 批处理简介

批处理,简而言之就是一次性执行多条SQL语句,在一定程度上可以提升执行SQL语句的速率。批处理可以通过使用Java的Statement和PreparedStatement来完成,因为这两个语句提供了用于处理批处理的方法。

1.2 批处理的3个方法

1.void addBatch(String sql):将需要执行的SQL语句添加到批处理中。

2.int [] executeBatch();执行批处理。

3.clearBatch();清空批处理。  

分别使用Statement和PreparedStatement执行批处理: 

package batch.transaction;

import com.yxp.util.DBUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;

/**
 * 批处理:本质就是执行多条SQL语句
 * 步骤1.添加进批处理addBath()
 * 步骤2.执行批处理executeBatch()
 * 步骤3.清空批处理clearBatch()
 */
public class Batch {
    static Connection con= null;
    public static void main(String[] args) throws SQLException {
        /**
         * 使用封装思想,更加贴近面向对象设计,代码的可读性更高
         */
        //PreparedStatement执行批处理
        System.out.println("PreparedStatement执行批处理:");
        ps(con);
        System.out.println("-------------------------------");
        //Statement执行批处理
        System.out.println("Statement执行批处理:");
        st(con);
        }
    private static void st(Connection con) throws SQLException {
        //1.获得连接
        con=DBUtils.getConnection();
        //2.获得语句处理对象
        Statement s=con.createStatement();
        for (int i =1; i <=2000 ; i++) {
            //3.写sql语句
            String sql_Statement="insert into t1_batch(name)values ('"+i+"')";
            //4.将sql语句放入批处理对象中
            s.addBatch(sql_Statement);
        }
        //5.执行批处理
        int[] arr1=s.executeBatch();
        //6.清空批处理
        s.clearBatch();
        System.out.println(arr1.length);
        System.out.println(Arrays.toString(arr1));
    }
    private static void ps(Connection con) throws SQLException {
        //1.获得连接
        con= DBUtils.getConnection();
        //2.写sql语句
        String sql_preparedStatement="insert into t1_batch (name)values (?)";
        //3.获得语句处理对象
            PreparedStatement ps=con.prepareStatement(sql_preparedStatement);
            long time1=System.currentTimeMillis();
            for (int i = 1; i <=2000 ; i++) {
                //4.参数赋值
                ps.setString(1,i+"_");
                //5.添加进批处理
                ps.addBatch();
                if(i%500==0){//每添加500个才执行一次,防止内存溢出
                    //6.执行批处理
                    ps.executeBatch();
                    //每执行一次批处理就清空一次
                    ps.clearBatch();
                }
            }
            //此段仍然不能丢失,剩余的可能不是500整数的需要单独处理
            int[] arr=ps.executeBatch();//一条sql语句更新处理以后,返回一个int数据,批处理他返回的是一个int[]
            //7.清空批处理
            ps.clearBatch();
        long time2=System.currentTimeMillis();
        System.out.println("共花费:"+(time2-time1)+"毫秒");
        System.out.println(Arrays.toString(arr));
    }
    }


 二(事务操作)

2.1 事务的简介

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。(访问并可能操作各种数据项的一个数据库操作序列)。 事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

事务结束有两种,事务中的步骤全部成功执行时,提交事务。如果其中一个失败,那么将会发生回滚操作,并且撤销之前的所有操作。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。

2.2 事务四大特征ACID

2.2.1. 原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。

2.2.2 一致性(Consistency) 

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。也就是说事务前后数据的完整性必须保持一致。

2.2.3 隔离性(Isolation) 

隔离性是指一个事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。

2.2.4 持久性(Durability) 

持久性是指一个事务一旦提交,对数据库中数据的改变就是永久性的。此时即使数据库发生故障,修改的数据也不会丢失。接下来其他的操作不会对已经提交了的事务产生影响。
 

模拟转账操作

package batch.transaction;

import com.yxp.util.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 事务4大特性:ACID
 * 1.原子性Atomicity
 * 2.一致性Consistency
 * 3.隔离性Isolation
 * 4、持久性Duration
 */
//模拟转账操作
public class Transaaction {
    static Connection con= null;
    static PreparedStatement ps=null;

    public static void main(String[] args) {
        transferaccounts(1,2,10000);
    }

    /**
     *
     * @param from 从谁的账户转
     * @param to   转给谁
     * @param money 转多少
     */
    private static void transferaccounts(int from, int to,double money) {
            //1.获得连接
        con= DBUtils.getConnection();
            //2.写sql语句
        String  sql1="update t1_icbc set money=money-? where id=? ";
        String  sql2="update t1_icbc set money=money+? where id=? ";
            //3.获得语句处理对象
        try {
            PreparedStatement ps1=con.prepareStatement(sql1);
            PreparedStatement ps2=con.prepareStatement(sql2);
            //4.参数赋值
            ps1.setDouble(1,money);
            ps1.setInt(2,from);
            ps2.setDouble(1,money);
            ps2.setInt(2,to);
            //如果需要回滚,需要设置事务手动提交
            con.setAutoCommit(false);
            //5.执行sql
            int res1=ps1.executeUpdate();
            /**
             * 模拟一个异常,程序结束
             */
            int a=4/0;
            int res2=ps2.executeUpdate();
            //判定:当二者都执行成功了
            if(res1==1&&res2==1){
                con.commit();//提交事务
            }
        } catch (Exception throwables) {
            throwables.printStackTrace();
            //数据要回滚,本身sql是默认自动提交事务的,无法回滚
            //异常被捕获,说明之前提交的数据需要回滚
            try {
                System.out.println("哎呀,转账失败……");
                con.rollback();//事务回滚
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                //由于数据库现在被设置手动提交,为了防止影响后续操作,运行以后一定需要将提交方式设置为自动
                try {
                    con.setAutoCommit(true);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

转账前,哈儿有30000元,狗蛋儿有20000元,当哈儿给狗蛋转账10000元后,哈儿就变成20000元,狗蛋儿就有30000元。

1.脏读 

脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。比如在事务 A 修改数据之后提交数据之前,这时另一个事务 B 来读取数据,如果不加控制,事务 B 读取到 A 修改过数据,之后 A 又对数据做了修改再提交,则 B 读到的数据是脏数据,此过程称为脏读。

2.不可重复读 


不可重复读是指在数据库访问中,一个事务范围内多次查询却返回了不同的数据值。这是由于在查询间隔中,其他事务修改并提交而引起的。比如事务 T1 读取某一数据,事务 T2 读取并修改了该数据,T1 为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

3. 幻读

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。比如事务 A 在按查询条件读取某个范围的记录时,事务 B 又在该范围内插入了新的满足条件的记录,当事务 A 再次按条件查询记录时,会产生新的满足条件的记录。
 

SQL的四个隔离级别


1.未提交读(Read Uncommitted)

一个事务能够读取到别的事务中没有提交的更新数据。事务中的修改,即使没有提交,其他事务也可以看得到。在这种隔离级别下有可能发生脏读,不可重复读和幻读。

2.提交读(Read Committed)

事务中的修改只有提交以后才能被其它事务看到。在这种隔离级别下解决了脏读,但是有可能发生不可重复读和幻读。

3.可重复读(Repeated Read)

保证了在同一事务中先后执行的多次查询将返回同一结果,看到的每行的记录的结果是一致的,不受其他事务的影响。但是这种级别下有可能发生幻读。

4.可串行化(Serializable)

不允许事务并发执行,强制事务串行执行。就是在读取的每一行数据上都加上了锁,读写相互都会阻塞,所以效率很低下。这种隔离级别最高,是最安全的,但是性能最低,不会出现脏读,不可重复读,幻读。

三(数据库连接池)

3.1 数据库连接池简介

简而言之,就是一个容器内有多个数据库连接,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理。连接池必须实现javax.sql.DataSource 接口,连接池里面维护的是一个DataSource的数据源。

3.2 使用数据库连接池的好处

(1)节省资源,如果每次访问数据库都创建新的连接,创建和销毁都浪费系统资源

(2)响应性更好,省去了创建的时间。

(3)统一的进行数据库管理,超时机制,减少JVM垃圾,减少数据库的过载。

3.3 常见的数据库连接池对象

1.DBCP2(DataBase Connection Pool 2)

数据库连接池,从Tomcat 5.5开始,Tomcat 内置了DBCP的数据源实现,所以可以非常方便地配置DBCP数据源.

2. C3P0

hibernate工作组进行维护,自动回收空闲连接。

3.德鲁伊 Druid

阿里巴巴的国产数据库连接池,能够提供强大的监控和扩展功能。

3.4 数据库连接池的常见参数配置

1、driverClassName 使用的JDBC驱动的完整有效的Java类名,如连接 mysql:com.mysql.cj.jdbc.Driver

2、url  数据库的连接地址。如 jdbc:mysql://127.0.0.1:3306/mydatabase

3、username 数据库的用户名,如 root

4、password 数据库的用户密码

5、initialSize 连接池创建的时候,自动创建的数据库连接数量(初始化连接数量),建议 10-50足够

6、maxIdle 最大空闲连接:连接池中允许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制,建议设置和 与initialSize相同,减少释放和创建的性能损耗。

7、minIdle  最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建

8、maxActive 最大同时激活的连接数量。

9、maxWait 如果连接池中没有可用的连接,最大的等待时间,超时则没有可用连接,单位毫秒,设置-1时表示无限等待,建议设置为100毫秒

10、testxxx  在对连接进行操作时,是否检测连接的有效性,如 testOnBorrow 在申请连接的时候会先检测连接的有效性,执行validationQuery ,建议线上的把此配置设置为false,因为会影响性能。

11、validationQuery 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果正常返回,则表示连接可用,否则表示连接不可用,建议 select 1 from dual
 

3.5 如何使用Druid

1.导入druid jar包

3.5.2  使用数据库连接池与数据库获得连接

配置文件:druid.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/wyy?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true
username=root
password=123456
#初始化连接数量
initialSize=5
#最大的活动连接
maxActive=10
#最大的等待时间
maxWait=6000
package druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DruidUtil {
 //连接池里面维护的是一个DataSource的数据源
 private static DataSource dataSource;
 static {
  Properties p=new Properties();
  try {
   InputStream is=new FileInputStream("D:\\javaEE\\VIP07_1\\jdbc\\src\\druid\\druid.properties");
   //使用配置文件对象读取字节流
   p.load(is);
   //数据源赋值
   dataSource= DruidDataSourceFactory.createDataSource(p);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
/**
 * 获得连接对象
 */
public static Connection getCon(){
 Connection conn=null;
 try {
  conn=dataSource.getConnection();
 } catch (SQLException e) {
  e.printStackTrace();
 }
 return conn;
}
 /**
  * 关闭链接
  */
 public static void close(Connection conn, Statement ps, ResultSet rs){
  if(rs!=null){
   try {
    rs.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  if(ps!=null){
   try {
    ps.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
  if(conn!=null){
   try {
    conn.close();
   } catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }

 public static void main(String[] args) {
  System.out.println(getCon());
 }
}

经测试,使用数据库连接池来与数据库获得连接,同样连接成功。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IO多路复用机制详解

高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型&#xff0c;常见的IO模型有四种&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即传统的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blo…

【WebGIS实例】(7)MapboxGL绘制不同颜色的Symbol图标

前言 在上一篇实例博客中&#xff08;MapboxGL绘制简易气泡图&#xff09;我们绘制了一个简易的单色气泡图&#xff0c;现在需求升级了。我们需要为气泡加载不同的颜色。 而要实现这个效果&#xff0c;其实相当简单&#xff0c;直接利用Mapbox提供的SDF渲染方法。 官网教程参考…

当星辰天合 SDS 遇见 Elastic

4 月 8 日&#xff0c;“Elastic 中国开发者大会 2023 ”在深圳举行&#xff0c;XSKY星辰天合对象存储产品总监邹博引代表星辰天合参加了此次大会&#xff0c;并做了主题为《SDS 与 Elasticsearch 的碰撞》的分享。“Elastic 中国开发者大会 2023 ”是由 Elastic、Elastic 中文…

【三十天精通Vue 3】 第三天 Vue 3的组件详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 组件的概述1. Vue 3 的组件系统2. Vue 3 组件的特点…

【CE】Mac下的CE教程Tutorial:进阶篇(第9关:共享的代码)

▒ 目录 ▒&#x1f6eb; 导读开发环境1️⃣ 第9关&#xff1a;共享的代码翻译操作&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x1f6eb; 导读 开发环境 版本号描述文章日期2023-03-操作系统MacOS Big Sur 11.5Cheat Engine7.4.3 1️⃣ 第9关&#xff1a;共享的代码 翻…

Python数据分析matplotlib学习

Python数据分析的工具和库包括&#xff1a; 1.Jupyter Notebook&#xff1a;用于交互式数据分析和可视化。 2.NumPy&#xff1a;用于进行数值计算和数组操作。 3.Pandas&#xff1a;用于数据处理和清洗。 4.Matplotlib&#xff1a;用于数据可视化。 5.Scikit-learn&#xff1a;…

MAZDA CX-50没现车怎么办?赶紧去VR看车啊!

爱车一族往往都有过这样的经历&#xff1a;听说某家品牌出了一款心仪的新车&#xff0c;于是一直心心念念想要先睹为快。然而这时候问题就来了&#xff1a;新车从发布到量产上市往往要经历一段过程。没有现车的日子里&#xff0c;就算每天去4S店蹲守也看不到新车。那种心里痒痒…

集成学习详细总结(不涉及数学理论部分)

集成学习&#xff08;Ensemble Learning&#xff09; 1概念 集成学习就是将多个弱学习器组合在一起&#xff0c;从而得到一个更好更全面的强监督学习器模型。其中集成学习被分为3大类&#xff1a;bagging&#xff08;袋装法&#xff09;不存在强依赖关系&#xff0c;其中基学…

Pytorch深度学习笔记(一)前瞻概述

目录 1.人类智能Human intelligence 2.机器学习Machine learning 3.学习系统Learning System 4.神经网络neural network 课程推荐&#xff1a;《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili 1.人类智能Human intelligence 人类智能Human intelligence&#xff1a;把视…

2023年第十四届蓝桥杯javaB组省赛真题

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;练习时长两年半的java博主 &#x1f4d6;个人主页&#xff1a;君临๑ &#x1f39e;️文章介绍&#xff1a;2023年第十四届蓝桥杯javaB组省赛真题 &#x1f389;所属专栏&#xff1a;算法专栏 &#x1f381; ps&#xff1a;点…

批量自动翻译软件-准确的翻译软件

现代社会&#xff0c;在全球化背景下&#xff0c;语言障碍是碍企业发展的主要因素之一。而翻译软件的出现&#xff0c;为人们跨越语言障碍带来了新的解决方案。针对翻译需要大量文字内容的情况&#xff0c;有一些能翻译大量文字的翻译软件&#xff1a; 147CGPT翻译软件特点&…

【硬件】嵌入式板卡硬件电路设计、焊接

文章目录嵌入式板卡电路 框图常用焊接工具和焊接操作 框图一、元器件//——有极性——//1 肖特基二极管2 钽电容3 三极管4 MOS5 LED6 SMAJ5.0CA&#xff08;TVS管&#xff09;8 SRV05-4&#xff08;ESD管&#xff09;7 电解电容//——无极性——//1 电容2 电阻3 电感4 保险丝//…

软件测试别再说简历项目不会写了,给你安排的明明白白

目录 个人信息 职业技能 工作经历 项目经历 工作经历 项目经历 教育经历 自我评价 个人信息 姓 名&#xff1a;xxx 性 别&#xff1a;女 手 机&#xff1a;xxxxxxxxxxxx 最高学历&#xff1a;统招硕士 工作年限&#xff1a;3 年 职…

Linux搭建docker

1. 查看系统的内核版本 [rootwide ~]# uname -r 3.10.0-1160.el7.x86_642. 将yum更新到最新版本 [rootwide ~]# yum upate -y Complete!3. 安装Docker所需的依赖包 [rootwide ~]# sudo yum install -y yum-utils device-mapper-persistent-data lvm2 Loaded plugins: fastes…

Ae:几何选项

在 Ae 中&#xff0c;一个图层开启 3D 之后&#xff0c;会多出几何选项 Geometry Options和材质选项 Material Options两个属性组。如果“几何选项”不可用&#xff0c;可尝试“更改渲染器” Change Renderer&#xff0c;比如&#xff0c;在合成设置中将“经典 3D” Classic 3D…

SpringBoot使用Freemarker导出word模板(OpenXML)

1、OpenXML word.docx文档另存为xml之后会生成带有OpenXML标签的文档。 1.1、常用标签示意 标签解释<w:wordDocument>XML文档开头描述&#xff0c;包括各种命名空间的描述<o:DocumentProperties> <o:CustomDocumentProperties> <w:fonts> <w:sty…

算法总结-深度优先遍历和广度优先遍历

深度优先遍历(Depth First Search&#xff0c;简称DFS) 与广度优先遍历(Breath First Search&#xff0c;简称BFS)是图论中两种非常重要的算法&#xff0c;生产上广泛用于拓扑排序&#xff0c;寻路(走迷宫)&#xff0c;搜索引擎&#xff0c;爬虫等。 一、深度优先遍历 深度优先…

网络编程三要素

网络编程三要素 IP、端口号、协议 三要素分别代表什么 ip&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 端口号&#xff1a;应用程序在设备中的唯一标识 协议&#xff1a;数据在网络中传输的规则 常见的协议有UDP、TCP、http、https、ftp ip&#xff1a;IPv4和…

mongodb $lookup 联表查询

ollection orders : orders record example collection items :items record example $lookup 联表查询 通过item字段连接两个集合orders和items,然后使用 $replaceRoot 中的 $mergeObjects 合并成items和orders的连接文档 db.orders.aggregate( [{$lookup: {from: …

ChatGPT原理解析

文章目录Transformer模型结构构成组件整体流程GPT预训练微调模型GPT2GPT3局限性GPT4相关论文Transformer Transformer&#xff0c;这是一种仅依赖于注意力机制而不使用循环或卷积的简单模型&#xff0c;它简单而有效&#xff0c;并且在性能方面表现出色。 在时序模型中&#…