首页 > 其他分享 >JDBC学习日志五,JDBC操作事务

JDBC学习日志五,JDBC操作事务

时间:2023-05-15 14:35:17浏览次数:46  
标签:事务 JDBC 数据库 st connection 日志 连接 连接池

事务:要么成功,要么失败

ACID原则

原子性:要么全部完成,要么都不完成

一致性:最终的结果总数据不发生改变

隔离性:多个进程互不干扰

持久性:数据一旦提交不可逆,持久化到数据库

模拟转账事务

//模拟转账
 public class TransferDemo {
     public static void main(String[] args) throws SQLException {
         //connection代表数据库
         Connection connection = null;
         PreparedStatement st = null;
         try {
             connection = JdbcUtil.getConnection();
             //1.手动设置关闭自动提交事务,此时,事务自动开启
             connection.setAutoCommit(false);
             String sql1 = "update account set money = money - 100 where `name` = 'A';";
             st = connection.prepareStatement(sql1);
             st.executeUpdate();
             int num = 1/0;//强制制造问题
             String sql2 = "update account set money = money + 100 where `name` = 'B';";
             st = connection.prepareStatement(sql2);
             st.executeUpdate();
             //2.提交数据
             connection.commit();
             System.out.println("转账成功");
         } catch (SQLException e) {
             //数据出现问题,事务会自动回滚到原来的样子,这里可以不用设回滚
             try {
                 connection.rollback();
             } catch (SQLException ex) {
                 ex.printStackTrace();
             }
         }finally {
             JdbcUtil.release(connection,st,null);
 ​
         }
 ​
     }

问题:每次连接数据库都需要消耗大量的资源,效率低

解决:创建一个连接池。每次应用程序需要从数据库获取数据时,直接从连接池中申请一个连接使用,用完之后连接池回收连接,从而达到连接复用的效果,并减少资源消耗的目的

本质:准备一些预先的资源,过来就直接连接预先准备好的(池化技术)

开源的连接池项目:

  • DBCP

  • D3P0

  • Druid

使用了这些数据库连接池,我们就不需要编写连接数据库的代码

DBCP

 InputStream rs = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
             Properties properties = new Properties();
             properties.load(rs);
             //获取数据源 BasicDataSourceFactory  工厂:用来创建对象的
                 dataSource = BasicDataSourceFactory.createDataSource(properties);

总结:无论用什么连接源,本质还是一样的,DataSource接口不会变,获取connection方法就不会变

狂神说MySQL

标签:事务,JDBC,数据库,st,connection,日志,连接,连接池
From: https://www.cnblogs.com/yzx-sir/p/17401456.html

相关文章

  • MYSQL数据库之事务隔离级别详解
    本系列为:MySQL数据库详解,为千锋资深教学老师独家创作致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!前言从今天开始本系列内容就带各位小伙伴学习......
  • Java日志体系
    转载:https://juejin.cn/post/6905026199722917902前言对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,基于日志的业务逻辑统计分析等都离不日志。java领域存在多种日志框架,目前常用的日志框架包括Log4j1,Log4j2,CommonsLogging,Slf4j,Logback,Jul。但是在我们的......
  • maven引入ojdbc14.jar的方法
    1、ojdbc14.jar的导入方法:①与导入其它jar包相同,在项目pom.xml文件中,可以采用Dependencies向导搜索并导入代码,可以发现其GroupId为com.oracle,ArtifactId为ojdbc14,目前最新版本为:10.2.0.4.0,因此有如下代码:com.oracleojdbc1410.2.0.4.0如果是其它一些常见的包,如Struts、Sprin......
  • JDBC学习日志四,PreparedStatement
    PreparedStatement可以防止sql注入问题,效率更高先进行预编译sql,将要设置的字段值使用占位符本质:预编译会将传递进来的参数包裹成字符,而单引号会被转义字符转换为空内容,有效的防止sql注入的问题CRUD--SELECTStringsql="select*fromuserswhereid=?";st=......
  • Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class
    报错代码Loadingclass`com.mysql.jdbc.Driver'.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver'.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.Exceptionin......
  • python-flask 技能点使用-03 请求钩子实现审计日志
    场景分析     使用pythonflask开发web系统,该系统是基于用户认证鉴权的web系统,系统中涉及到关键数据的操作,因此需要针对业务操作进行记录(也就是审计日志),便于管理员后期查看,在基于java的Spring系列框架中我们可以借助于AOP面向切面的编程来完成,在使用Flask时可以借助......
  • JDBC学习日志二,第一个JDBC程序与JDBC对象解释
    第一步,创建user表,测试数据库CREATEDATABASE`jdbcstudy`/*!40100DEFAULTCHARACTERSETutf8mb3*//*!80016DEFAULTENCRYPTION='N'*/usejdbcstudy;CREATETABLE`users`(`id`intNOTNULL,`NAME`varchar(40)DEFAULTNULL,`PASSWORD`varchar(40......
  • MySQL 存储过程&触发器&事务
    存储过程概念存储过程(StoredProcedure),是为了完成特定功能的SQL语句集。优点存储过程可以理解为shell脚本这类型的命令集输出工具,但是在底层,存储过程拥有更多的优点:语言的灵活性跟功能性更强,在原有基础之上可以插入控制语句、循环语句等让SQL语句的功能更强,能够完成更复杂的......
  • MySQL学习日志十四,数据库的备份
    数据库备份必要性1.保证重要数据不丢失2.数据转移3.MySQL数据库备份方法mysqldump备份工具1.数据库管理工具,如SQLyog2.直接拷贝数据库文件和相关配置文件3.mysqldump客户端作用:转储数据库搜集数据库进行备份将数据转移到另一个SQL服务器,不一定是MySQL服务器--导......
  • 小知识:设置archive_lag_target参数强制日志切换
    为客户测试一个ADG场景问题,发现测试环境的日志切换频率过低,总是需要定期手工切换,这非常影响测试心情。实际上,可以设置archive_lag_target参数强制日志切换。比如设置:altersystemsetarchive_lag_target=1800;这样即使库没任何压力,半小时也会切换一次日志。该设置同时也适......