事务 与 数据库连接池【c3p0】 与 DBUtiles的总结

采用事务、c3p0连接池配置、DBUtiles中的QueryRunner结合 采用事务、c3p0连接池配置、DBUtiles中的QueryRunner结合作为mysql数据库的插入一条数据 立即下载

1.事务

开启事务:start transaction;
回滚事务:rollback;
提交事务: commit;
关闭自动提交事务:setAutoCommit(false);
1.1事务的特性ACID【】
1.原子性【A】:事务包含的逻辑不可分割
一致性【C】:事务执行前后,数据完整性
隔离性【I】 :事务执行期间不受其他事务影响
持久性【D】:事务执行成功,则数据永久保存到磁盘上;
1.1.2.事务的安全隐患:
不考虑隔离级别设置:
【读】:
1.脏读:>>>一个事务读到另外一个事务还未提交的数据;
2.不可重复读:>>>一个事务读到了另外一个事务提交的数据,造成两次查询结果不一致;>>>解决:重复读:repeatable read;【默认】
3.幻读:一个事务读到另外一个事务已提交插入的数据,导致多次查询结果不一致。>>>>解决:Serializable【可串行化】最高级别
四个隔离级别的效率从高到低排列:
读未提交>读已提交>可重复读>可串行化
拦截程度相反

【写】:丢失更新
>>>解决:1.悲观锁;
======== 2.乐观锁

【mysql默认隔离级别:可重复读】
【oracle默认隔离级别:读已提交】
1.1.3在代码中使用事务的步骤

Connection conn = JDBCUtil.getConn();
conn.setAutoCommit(false);//关闭事务的自动提交
.....
conn.commit();//提交
conn.roolback();//回滚

2.数据库连接池

2.1DBCP连接池【了解】
dbcp创建dataSource方式:

BasicDataSource dataSource = new BasicDataSource();

2.1.1使用代码方式连接【了解】
将数据插入到bank下的account表中

public class demo1 {
	@Test
	public void dbcp(){
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			//1.构建数据源对象
			BasicDataSource dataSource = new BasicDataSource();
			dataSource.setDriverClassName("com.mysql.jdbc.Driver");
			dataSource.setUrl("jdbc:mysql://localhost/bank");
			dataSource.setUsername("root");
			dataSource.setPassword("123456");
			//2.获得连接对象
			conn = dataSource.getConnection();
			String sql = "insert into account values(null,?,?)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, "admin");
			ps.setInt(2, 20000);
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, ps);
		}
	}
}

2.1.2使用配置文件方式

2.2 c3p0连接池【掌握】
c3p0创建dataSource连接方式:

ComboPooledDataSource dataSource = new ComboPooledDataSource();

2.2.1代码连接【了解】

public class demo1 {
	@Test
	public void c3p0() throws PropertyVetoException{
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			//1.创建dataSource
			ComboPooledDataSource dataSource = new ComboPooledDataSource();
			//2.设置连接数据信息
			dataSource.setDriverClass("com.mysql.jdbc.Driver");
			dataSource.setJdbcUrl("jdbc:mysql://localhost/bank");
			dataSource.setUser("root");
			dataSource.setPassword("123456");
			
			
			conn = dataSource.getConnection();
			String sql = "insert into account values(null,?,?)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, "aaa");
			ps.setInt(2, 12000);
			ps.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, ps);
		}
	}
}

2.2.2c3p0配置文件连接方式【★掌握】
c3p0-config.xml的源文件

<c3p0-config>
  <default-config>
    <property name="automaticTestTable">con_test</property>
    <property name="checkoutTimeout">30000</property>
    <property name="idleConnectionTestPeriod">30</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">200</property>

    <user-overrides user="test-user">
      <property name="maxPoolSize">10</property>
      <property name="minPoolSize">1</property>
      <property name="maxStatements">0</property>
    </user-overrides>

  </default-config>

  <!-- This app is massive! -->
  <named-config name="intergalactoApp"> 
    <property name="acquireIncrement">50</property>
    <property name="initialPoolSize">100</property>
    <property name="minPoolSize">50</property>
    <property name="maxPoolSize">1000</property>

    <!-- intergalactoApp adopts a different approach to configuring statement caching -->
    <property name="maxStatements">0</property> 
    <property name="maxStatementsPerConnection">5</property>

    <!-- he's important, but there's only one of him -->
    <user-overrides user="master-of-the-universe"> 
      <property name="acquireIncrement">1</property>
      <property name="initialPoolSize">1</property>
      <property name="minPoolSize">1</property>
      <property name="maxPoolSize">5</property>
      <property name="maxStatementsPerConnection">50</property>
    </user-overrides>
  </named-config>
</c3p0-config>

所以我们在定义c3p0配置文件时必须也使用c3p0-config.xml这个名字
在这里插入图片描述
c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost/bank</property>
    <property name="user">root</property>
    <property name="password">123456</property>
  
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
    <property name="maxStatements">200</property>
  </default-config>
</c3p0-config>

c3p0_demo2.java

public class c3p0_demo2 {
	@Test
	public void test(){
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			ComboPooledDataSource dataSource = new ComboPooledDataSource();
			//获得连接对象
			conn = dataSource.getConnection();
			String sql = "insert into account values(null,?,?)";
			ps = conn.prepareStatement(sql);
			ps.setString(1, "c3p0");
			ps.setInt(2, 18000);
			ps.executeUpdate();//执行
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, ps);//释放
		}
	}
}

运行后数据库情况
在这里插入图片描述
这里就把数据插进来了。
【特别注意】xml文件的命名一定是:c3p0-config.xml,否则就会执行失败

3.DBUtiles

QueryRunner

//1.c3p0创建连接
ComboPooledDataSource dataSource = new ComboPooledDataSource();
//2.dbUtil只是简化CRUD的代码,但是不可以创建连接
QueryRunner run = new QueryRunner(dataSource);

两个常用的方法:
1.queryRunner.update();//增删改
2.queryRunner.query();//查询
3.1DBUtiles里的增删改
dbUtil只是简化CRUD的代码,但是不可以创建连接

public class Tset {
	@Test
	public void testInsert() throws SQLException{
		//1.c3p0创建连接
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		//2.dbUtil只是简化CRUD的代码,但是不可以创建连接
		QueryRunner run = new QueryRunner(dataSource);
		String sql = "insert into account values(null,?,?)";
		//3.增加
		run.update(sql, "dbutil",230000);
		//4.删除
		run.update("delete from account where id = ?", 8);
		//5.更新
		run.update("update account set money=? where id=?", 20000,4);
	}
}

3.2DBUtiles通用的增删改方法
通过元数据获取有几个?(即占位符)

	ParameterMetaData metaData = ps.getParameterMetaData();
	int count = metaData.getParameterCount();
public void test(){
		update("insert into account values(null,?,?)", "common",100000);
	}
	
public class CommonUtil {
	public void update(String sql,Object...args){
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = JDBCUtil.getConn();
			ps = conn.prepareStatement(sql);
			ParameterMetaData metaData = ps.getParameterMetaData();//获取元数据
			int count = metaData.getParameterCount();//获取个数,这里获取?的个数
			
			for (int i = 0; i < count; i++) {
				ps.setObject(i+1, args[i]);
			}
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			JDBCUtil.release(conn, ps);
		}
	}
}

3.3DBUtiles里的查询
这里用到泛型,现在Domain层建立一个Account类:
生成set,get方法,重写String

private String name;
private int money;

(一)代码实现
在这里插入图片描述
1.查询单条数据
new BeanHandler<‘T’>(class文件);

public class Select {
	@Test
	public void selectDemo() throws SQLException{
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		QueryRunner runner = new QueryRunner(dataSource);
		//查询单条数据
		Account account = runner.query("select * from account where id=?",
					new BeanHandler<Account>(Account.class), 9);
		System.out.println(account);
	}
}
Account [name=dbutil, money=230000]

2.查询多条数据
new BeanListHandler<‘T’>(class);

public class Select {
	@Test
	public void selectDemo() throws SQLException{
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		QueryRunner runner = new QueryRunner(dataSource);
		//查询单条数据
	List<Account> list= runner.query("select * from account",
					new BeanListHandler<Account>(Account.class));
		System.out.println(list);
	}
}
[Account [name=张三, money=23000], Account [name=李四, money=25000], Account [name=admin, money=20000], Account [name=aaa, money=20000], Account [name=c3p0, money=18000], Account [name=dbutil, money=230000], Account [name=dbutil, money=230000], Account [name=dbutil, money=230000], Account [name=dbutil, money=230000]]
AnyLogic 8.8.3 最新版安装指南:从下载到配置的完整流程(附Java环境设置技巧) 本文提供了AnyLogic 8.8.3最新版从下载到配置的完整安装指南,重点解决了跨平台(Windows、macOS、Linux)部署中的常见问题。核心内容详细讲解了Java开发环境(JDK)的精准配置技巧,包括版本选择、系统环境变量设置与验证,确保为仿真建模工作奠定稳固基础。 阅读详情

相关推荐

74LS161/48 交通灯控制系统:30-5-20-5 时序逻辑电路 Multisim 仿真验证

本文详细解析了基于74LS161/48芯片的交通灯控制系统设计,通过Multisim仿真验证30-5-20-5时序逻辑电路。从系统架构搭建、状态机实现到波形分析,提供全流程操作指南与典型问题排查方法,助力数字电路课程设计高效完成。

weixin_26742753的博客 380

c3p0实现对数据库的增删改查(JDBC加强版)

1.先将jar包导好(其中第二个和第三个不用导): 2.创建一个c3p0带.xml的文件且放在src目录下: 3.先创建一个学生类: public class Student { private int id; private String name; private String sex; private String brithday; ...

兔的骄傲 2259

全新RGB-D及平面法线数据集DIODE

丰田工业大学联合芝加哥大学和北航发布全新RGB-D及平面法线数据集 DIODE (Dense Indoor and Outdoor DEpth)。

qq_43477338的博客 1540

使用c3p0对mysql进行增删改查_c3p0连接池连接数据库 并增删改查

使用c3p0连接池连接数据库示例(mvc模式)1.mysql.properties (连接数据库的)文件:driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&useUnicode=true...

weixin_28996657的博客 420

从理论到实践:笛卡尔空间阻抗控制的实现挑战与变体解析

本文深入探讨了笛卡尔空间阻抗控制的核心原理、工程实现中的五大挑战及经典变体实战解析。通过详细的数学建模和实际案例分析,揭示了阻抗控制在工业机器人、医疗设备等领域的应用价值,特别是在力感知精度、动力学模型校准和实时计算等方面的关键技术突破。

weixin_30952535的博客 449

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3744

一个关于 CP30+DBUtils 的简单数据库操作封装

1:本文的适用人群 学习了 JDBC CP30 DBUtils BeanUtils 的同学们 没有学习高阶ORM框架的同学们 2:本文能给你们带来什么 一个能实现快速 CRUD 以及 简单事务操作 的 封装 3:代码  package Utils; import com.mchange.v2.c3p0.ComboPooledDataSource; import org

陈齐康的博客 538

01-诊断开发流程概述

传送门 ==>> AutoSAR入门和实战系列总目录。

1787

C3P0数据库连接池的解析

C3P0官网配置中文解析

hangejnu123的博客 2592

Jetson Thor平台JP7.0版本96712 GMSL相机驱动调试记录

摘要:本文档记录了在Thor Custom Board (JP7.0GA)上配置GMSL摄像头时遇到的视频流问题及调试过程。问题表现为视频设备(/dev/video11)能正常创建,但获取视频时出现"Internal data stream error",而相同配置在AGX Orin JP6.0上运行正常。通过梳理硬件拓扑、v4l2-ctl测试、提升时钟频率及分析内核日志,发现VI引擎未接收到帧数据包。调试步骤包括检查设备树冲突、调整I2C总线配置、修正通道名称,最终通过屏蔽传感器启动时

jzwjzw19900922的博客 1112

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

随着新零售和智能仓储的快速发展,商品识别技术成为计算机视觉领域的重要研究方向。本文详细介绍了基于YOLO系列算法的商品识别系统的完整实现方案,涵盖算法原理、数据集构建、模型训练、系统集成和可视化界面开发。通过对比YOLOv5到YOLOv8各版本性能差异,我们构建了一个高效、准确且用户友好的商品识别系统,并提供完整的代码实现。

YOLO 287

Hibernate的事务与C3P0的配置

在hibernate开发中配置c3p0 数据库连接池          hibernate框架内部使用默认数据库连接池 DriverManagerConnectionProvider 提供 使用c3p0 修改hibernate 默认的 ConnectionProvider          步骤:          1、 导入jar包 hibernate解压目录/lib/optio

欢迎来到跃行者技术博客 1990

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

XiaoqiangClub的博客 5167

事务、数据库连接池、DBUtiles笔记

1、事务介绍 事务,其实指的就是一组操作,里面包含许多个单一的逻辑。只要一个逻辑没有执行成功,那么都算失败。所有的数据都回归到最初的状态(回滚)。 为什么要有事务? 为了确保逻辑的成功。例如:银行的转账 使用命令行方式演示事务: commit,提交事务,数据将会写到磁盘上的数据库。rollback,数据回滚,回到最初状态。 使用代码方式演示事务: 注:事务只针对当前的连接对象,如果再开一个连...

Ydecube的博客 350

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

第77节:Java中的事务和数据库连接池和DBUtiles

第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功就算失败,导致回滚就是指所有的数据都会回到最初的状态. 有事务,是为了保证逻辑一定要成功,如银行转账. 回顾一下 什么是jsp,jsp的三大指令. p...

程序员哆啦A梦,蓝胖子 592

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

事务&数据库连接池&DBUtiles

#事务&数据库连接池&DBUtils ##事务 Transaction 其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚) 为什么要有事务? 为了确保逻辑的成功。 例子: 银行的转账。 ###使用命令行方式演示事务。 开启事务 start transaction; 提交或者回滚事务 co...

weixin_43185348的博客 180

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

13-事务&数据库连接池&DBUtiles

事务&数据库连接池&DBUtils 事务 Transaction其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚) 为什么要有事务? 为了确保逻辑的成功。 例子: 银行的转账。 使用命令行方式演示事务。 开启事务 start transaction; 提交或者...

diaozongjian9397的博客 191

笔记整理19----事务&数据库连接池&DBUtiles

事务&amp;数据库连接池&amp;DBUtils 事务 Transaction 其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚) 为什么要有事务? 为了确保逻辑的成功。 例子: 银行的转账。 使用命令行方式演示事务。 开启事务 start transaction; 提交或者回滚事务 commit; ...

javadamn的博客 178

Java Web(六) -- 事务 & 数据库连接池 & DBUtiles

事务 & 数据库连接池 & DBUtils 事务   Transaction 其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚) 1、为什么要有事务?   为了确保逻辑的成功。 例子: 银行的转账。 使用命令行方式演示事务。   开启事务   start transaction; ...

weixin_30517001的博客 96

day06-事务&数据库连接池&DBUtiles

#事务&数据库连接池&DBUtils ##事务 Transaction 其实指的一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚) 为什么要有事务? 为了确保逻辑的成功。 例子: 银行的转账。 ###使用命令行方式演示事务。 开启事务 start transaction; 提交或者回滚事务 commit; 提交事务, 数据将会写到磁盘上的数据库 rollback ; 数据回滚,回到最初的状态。 关

qq_41518179的博客 231

【很全很新】C3P0 连接池和 DBUtils 配合事务使用总结

很久没用原生连接池,最近想写个小功能,结果发现很多地方不太懂,然后网上搜了半天的 c3p0 相关内容,全不符合我想要的。相同内容太多 而且没什么,所以我自己来总结下吧。 01 总结全文 从以下来总结 连接池的作用,为什么要使用连接池 书写自己的连接池,用于理解框架 c3p0 等连接池 连接池框架 c3p0 使用 连接池框架 c3p0 和 DBUtils 的配合使用 配合事务的使用(重点,这...

weixin_33769207的博客 290

学习笔记-JDBC

概念:java DataBase Connectivity Java数据库连接(java语言操作数据库) 本质:其实就是sun公司定义的一套操作所有关系型数据库的规则(接口),各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类。 快速入门: 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar...

AiTer的博客 250

c3p0连接死锁

  c3p0连接死锁           笔主今天遇到了c3p0连接池死锁的问题,c3p0发生死锁大多跟配置文件有关。如果c3p0连接池设置过小。当连接池满时。由于没有对各个线程设置优先级。导致后面的线程一直等待连接。造成死锁。        解决办法:把max_statements设置为0。       c3p0在同时关闭statement和connection的时候,或者关闭...

Cain_1507的博客 1009

数据库连接池c3p0

简介 c3p0是用于创建和管理连接,利用“池”的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能。目前,hibernate自带的连接池就是c3p0。 本文将包含以下内容(因为篇幅较长,可根据需要选择阅读): c3p0的使用方法(入门案例、JDNI使用) c3p0的配置参数详解 c3p0主要源码分析 使用例子-入门 需求 使用C3P0连接池获取连接对象,对用户数据进行简单的增删改查(sql脚本项目中已提供)。 工程环境 JDK:1.8

leeta的博客 2394
上一篇: JavaWeb(一)JSP与EL表达式和JSTL
下一篇: JavaWeb(二)MVC设计模式
一朝游
博客等级 码龄8年 0粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值