09 事务和连接池

文章目录

    • properties文件
    • 连接池
    • service层实现类
    • dao层实现类
    • dao层实现类

事务和连接池

连接池类:
创建线程池静态常量,用于放连接。
创建Properties静态常量,用于解析properties文件
静态代码块中,解析properties文件,将解析结果用于创建连接池
连接方法:用线程获取连接,若没有,从连接池中拿一个连接,放到线程中去
释放连接方法:将线程变量清除,去除事务,连接放到连接池中

service层实现类
从连接池中获取一个连接,这个连接是在线程中
设置事务(自动提交为false)
获取两个dao,两个dao都是操作同一个连接
提交事务
释放连接

dao层减钱、加钱

properties文件

driverClass=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
username=root
password=root
initialSize=10
maxActive=20
minIdle=5
maxWait=5000

连接池

package com.aistart.tech.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;public class JdbcPoolUtil {private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();private static final Properties info = new Properties();private static DataSource dataSource = null;
//    private static Connection connection = null;static {try {info.load(JdbcPoolUtil.class.getClassLoader().getResourceAsStream("com/aistart/tech/config/druid.properties"));} catch (IOException e) {throw new RuntimeException(e);}//数据库连接池应该也同时被创建try {dataSource = DruidDataSourceFactory.createDataSource(info);} catch (Exception e) {throw new RuntimeException(e);}}public static Connection getConnection() throws SQLException {Connection connection = threadLocal.get();if (connection==null){connection = dataSource.getConnection();threadLocal.set(connection);}return connection;}public static void freeConnection(){Connection connection = threadLocal.get();if (connection!=null){try {//把线程变量清除threadLocal.remove();//恢复原来的状态connection.setAutoCommit(true);connection.close();} catch (SQLException e) {throw new RuntimeException(e);}}}}

service层实现类

package com.aistart.tech.servcice.impl;import com.aistart.tech.dao.IAccuntDao;
import com.aistart.tech.dao.impl.AccuntDaoImpl;
import com.aistart.tech.entity.Accunt;
import com.aistart.tech.servcice.AccountService;
import com.aistart.tech.utils.JdbcPoolUtil;import java.sql.Connection;
import java.sql.SQLException;public class AccountServiceImpl implements AccountService {IAccuntDao accuntDao = new AccuntDaoImpl();@Overridepublic int getBalance(int id) {return 0;}@Overridepublic boolean transferMoney(Accunt accunt1, Accunt accunt2,int money) {Connection connection = null;try {//从数据库连接池拿出来一个连接connection = JdbcPoolUtil.getConnection();connection.setAutoCommit(false);accuntDao.subMoney(accunt1.getId(),money);accuntDao.addMoney(accunt2.getId(),money);connection.commit();System.out.println("service的conn"+ connection.getAutoCommit());} catch (Exception e) {try {connection.rollback();} catch (SQLException ex) {throw new RuntimeException(ex);}throw new RuntimeException(e);}finally {JdbcPoolUtil.freeConnection();}return false;}
}

dao层实现类

package com.aistart.tech.dao.impl;import com.aistart.tech.dao.IAccuntDao;
import com.aistart.tech.utils.JdbcPoolUtil;import java.sql.Connection;
import java.sql.SQLException;public class AccuntDaoImpl implements IAccuntDao {@Overridepublic int subMoney(int id, int money) {Connection connection = null;if (connection == null) {try {connection = JdbcPoolUtil.getConnection();System.out.println("这是dao层的connection"+connection.getAutoCommit());} catch (SQLException e) {throw new RuntimeException(e);}}return 0;}@Overridepublic int addMoney(int id, int money) {return 0;}
}

dao层实现类

package com.aistart.tech.dao.impl;import com.aistart.tech.dao.IAccuntDao;
import com.aistart.tech.utils.JdbcPoolUtil;import java.sql.Connection;
import java.sql.SQLException;public class AccuntDaoImpl implements IAccuntDao {@Overridepublic int subMoney(int id, int money) {Connection connection = null;if (connection == null) {try {connection = JdbcPoolUtil.getConnection();System.out.println("这是dao层的connection"+connection.getAutoCommit());} catch (SQLException e) {throw new RuntimeException(e);}}return 0;}@Overridepublic int addMoney(int id, int money) {return 0;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人生亏钱指南pdf分享【谨防上当】【警钟长鸣】不知道动了多少人蛋糕,看到后赶快收藏起来

查理芒格&#xff1a;如果知道我会死在哪里&#xff0c;那我将永远不去那个地方 书中分别投资篇、知识付费篇、合伙合作篇、实体项目篇、欺诈篇、借贷篇、健康篇等方向详细解释可能亏钱的坑&#xff01; 书中说到&#xff1a; 成年人的世界&#xff0c;踩坑已是日常&#xff0…

2024年R1快开门式压力容器操作证考试题库及R1快开门式压力容器操作试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年R1快开门式压力容器操作证考试题库及R1快开门式压力容器操作试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

电子证书查询系统如何制作证书?

1、制作空白证书&#xff1a;网上找一张证书背景图&#xff0c;用PPT工具或photoshop等图片处理工具&#xff0c;将证书上固定的文字打上&#xff0c;有公章的话贴上电子公章&#xff0c;不固定的内容留空白。 2、制作电子证书&#xff1a;上传前一步制作好的空白证书&#xf…

计算机408网课评测+资料分享

408当然有比较好的网课推荐&#xff0c;比如王道的视频课 现在大部分人备战408基本都用王道的讲义&#xff0c;然后再搭配王道408的课程来听&#xff0c;可以学的很好。 其中408视频课中&#xff0c;我认为讲的比较好的是数据结构&#xff0c;和操作系统&#xff0c;计算机组…

深入理解二叉树构建和中序遍历

在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;用于模拟层次化结构的关系。本文将介绍一个简单的C语言程序&#xff0c;该程序实现了对输入字符数组的解析&#xff0c;并构建相应的二叉树&#xff0c;随后对二叉树进行中序遍历。 二叉树定义 首先&#x…

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…

网络: 传输层

功能: 将数据从发送到传给接收端 UDP 无连接状态: 知道对端的IP和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制. 出错不会管面向数据包: 不能够灵活的控制读写数据的次数和数量 发送速度快: 立即发送 报文结构 TCP 面向连接可靠 校验和序列号(按…

stl格式3d模型怎么获得---模大狮模型网

获取STL格式的3D模型有几种常见的方法&#xff1a; 一&#xff1a;自己创建模型 如果你具备3D建模的技能&#xff0c;可以使用专业的3D建模软件(如Blender、3ds Max、SketchUp等)创建自己的3D模型。 在建模过程中&#xff0c;你可以设计模型的形状、细节和纹理等&#xff0c;…

ConcurrentHashMap底层详解

ConcurrentHashMap是线程安全且高效的HashMap。 一、使用原因 在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下&#xff0c;基于此产生了ConcurrentHashMap。 1.线程不安全的HashMap 在多线程环境下&#xff0c;使用HashMap进行put操…

【软考】耦合

目录 一、说明二、7种耦合2.1 无直接耦合2.2 数据耦合2.3 标记耦合2.4 控制耦合2.5 外部耦合2.6 公共耦合2.7 内容耦合 三、耦合性与独立性四、例题4.1 例题1 一、说明 1.耦合是模块之间的相对独立性&#xff08;互相连接的紧密程度&#xff09;的度量 2.耦合取决于各个模块之间…

贾志杰“大前端”系列著作出版发行

杰哥著作《VueSpringBoot前后端分离开发实战》2021年出版以来&#xff0c;累计发行2.6万册&#xff0c;受到广大读者热捧。后应读者要求&#xff0c;受出版社再次邀请&#xff0c;“大前端”系列之《剑指大前端全栈工程师》、《前端三剑客》由清华大学出版社陆续出版发行。系列…

23.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示…