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;}
}相关文章:
09 事务和连接池
文章目录 properties文件连接池service层实现类dao层实现类dao层实现类 连接池类: 创建线程池静态常量,用于放连接。 创建Properties静态常量,用于解析properties文件 静态代码块中,解析properties文件,将解析结果用于创建连接池 …...
P4344 [SHOI2015] 脑洞治疗仪 线段树+二分
主要是维护一个连续区间,比较经典的题目,还要考虑一下二分的情况,否则很难处理,比较有难度。这里和序列操作一题的区别是不需要考虑1的个数,因为不需要取反。传送门https://www.luogu.com.cn/problem/P4344 #include&…...
解决大型语言模型中的幻觉问题:前沿技术的综述
大型语言模型中的幻觉问题及其解决技术综述 摘要 大型语言模型(LLM)如GPT-4、PaLM和Llama在自然语言生成能力方面取得了显著进步。然而,它们倾向于产生看似连贯但实际上不正确或与输入上下文脱节的幻觉内容,这限制了它们的可靠性和安全部署。随着LLM在…...
机器学习流程—AutoML
文章目录 机器学习流程—AutoMLAutoML工具Auto-SKLearnMLBoxTPOTRapidMinerPyCaretAuto-KerasH2OAutoML谷歌AutoML云Uber LudwigTransmogrifAIAutoGluonAutoWekaDataRobot...
Ubuntu 23.10 tar包安装和配置Elasticsearch kibana 7.13.3
目录 一、环境说明 二、准备工作 三、安装elasticsearch 3.1 安装elasticsearch 3.2 添加服务和设置开机启动 四、安装kibana 4.1. 安装kibana 4.2 添加服务和设置开机启动 出于工作需要,需要在Ubuntu 23.10系统上通过tar包方式安…...
glibc内存管理ptmalloc
1、前言 今天想谈谈ptmalloc如何为应用程序分配释放内存的,基于以下几点原因才聊它: C/C 70%的问题是内存问题。了解一点分配器原理对解决应用程序内存问题肯定有帮助。C也在用ptmalloc. 当你在C中new一个对象时,底层还是依赖glibc中的ptma…...
HarmonyOS入门学习
HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…...
【Mock|JS】Mock的get传参+获取参数信息
mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…...
spring cloud gateway k8s优雅启停
通过配置readiness探针和preStop hook,实现优雅启动和停止(滚动部署) 1. k8s工作负载配置 readinessProbe:httpGet:path: /datetimeport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 1periodSeconds: 30successThreshold: 1fa…...
嵌入式软件面试-linux-中高级问题
Linux系统启动过程: BIOS自检并加载引导程序。引导程序(如GRUB)加载Linux内核到内存。内核初始化硬件,加载驱动,建立内存管理。加载init进程(PID为1),通常是systemd或SysVinit。init…...
css禁用元素指针事件,鼠标穿透,点击下层元素,用`pointer-events:none;`
pointer-events: 对鼠标事件的反应 MDN pointer-events 英文 https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events 菜鸟教程 CSS pointer-events 属性 https://www.runoob.com/cssref/css3-pr-pointer-events.html 常用取值 auto 和 none pointer-events: aut…...
Eureka的介绍和作用,以及搭建
一、Eureka的介绍和作用 Eureka是Netflix开源的一种服务发现和注册工具,它为分布式系统中的服务提供了可靠的服务发现和故障转移能力。Eureka是Netflix的微服务架构的关键组件之一,它能够实时地监测和管理服务实例的状态和可用性。 在Eureka架构中&…...
shell和linux的关系
Shell 和 Linux 之间存在密切的关系,但它们并不是同一个东西。让我们分别了解一下它们: Linux: Linux 是一个自由和开放源代码的类UNIX操作系统。 Linux 的内核由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布&…...
数据在内存的存储
整数在内存中的存储 我们来回顾一下,整数在计算机是以补码的形式进行存储的,整数分为正整数和负整数,正整数的原码、反码和补码是一样的,负整数的原码、反码和补码略有不同(反码是原码除符号位,其他位按位取…...
JavaScript之ES中的类继承与Promise
类 ES5中的类及继承 //人function Person(name,age){this.name name;this.age age;}Person.prototype.eat function () {console.log(this.name "eat");}//程序员,继承,人function Programmer(name,age,language){//构造函数继承Person.…...
浅析多模态大模型技术路线梳理
前段时间 ChatGPT 进行了一轮重大更新:多模态上线,能说话,会看图!微软发了一篇长达 166 页的 GPT-4V 测评论文,一时间又带起了一阵多模态的热议,随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后…...
使用 Amazon SageMaker 微调 Llama 2 模型
本篇文章主要介绍如何使用 Amazon SageMaker 进行 Llama 2 模型微调的示例。 这个示例主要包括: Llama 2 总体介绍Llama 2 微调介绍Llama 2 环境设置Llama 2 微调训练 前言 随着生成式 AI 的热度逐渐升高,国内外各种基座大语言竞相出炉,在其基础上衍生出…...
牛客小白月赛86(D剪纸游戏)
题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行,每行包含 m 个字符,代表残缺纸张。 保证: 1≤n,m≤10001 字符仅有 . 和 * 两种字符…...
MySQL的基础操作与管理
一.MySQL数据库基本操作知识: 1.SQL语句: 关系型数据库,都是使用SQL语句来管理数据库中的数据。 SQL,即结构化查询语言(Structured Query Language) 。 SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控…...
Pytorch 中的forward 函数内部原理
PyTorch中的forward函数是nn.Module类的一部分,它定义了模型的前向传播规则。当你创建一个继承自nn.Module的类时,你实际上是在定义网络的结构。forward函数是这个结构中最关键的部分,因为它指定了数据如何通过网络流动。 单独设计 forward …...
为什么PUT和DELETE请求在大公司中逐渐被弃用?
为什么PUT和DELETE请求在大公司中逐渐被弃用? 一、引言:RESTful 的 “标准款”,为何大厂不买单? 1.1 PUT 与 DELETE 的设计初心:RESTful 的理想模型 在 HTTP 协议的大家族里,PUT 和 DELETE 请求方法就像一对…...
DeepChat一文详解:DeepChat如何解决本地大模型‘启动难、维护难、升级难’三大痛点
DeepChat一文详解:DeepChat如何解决本地大模型‘启动难、维护难、升级难’三大痛点 1. 为什么本地大模型让人又爱又恨 如果你尝试过在本地电脑上部署大模型,很可能经历过这样的痛苦:好不容易找到合适的模型,下载安装一堆依赖库&…...
AIAgent不是升级ADAS,而是重构OS——奇点大会首发车载智能体中间件架构(含GitHub私有仓申请通道)
第一章:AIAgent不是升级ADAS,而是重构OS——奇点大会首发车载智能体中间件架构(含GitHub私有仓申请通道) 2026奇点智能技术大会(https://ml-summit.org) 传统ADAS系统以规则驱动、功能割裂、响应延迟为特征,而AIAgen…...
REX-UniNLU与Dify平台集成实战
REX-UniNLU与Dify平台集成实战 1. 场景价值:为什么需要这样的集成 在日常的AI应用开发中,我们经常遇到这样的困境:有一个很强大的自然语言理解模型,但要把它变成实际可用的服务,需要处理一大堆部署、接口、前后端联调…...
别再到处找了!5个经典高光谱数据集(Indian Pines/PaviaU等)的Python加载与预处理保姆级教程
高光谱图像处理实战:5大经典数据集的Python加载与预处理全解析 刚接触高光谱图像分析的研究者常会遇到一个尴尬局面——手握着.mat格式的数据文件,却不知从何下手。Indian Pines、PaviaU这些经典数据集在论文中被反复引用,但当你真正打开这些…...
告别Gazebo/Rviz模型‘隐身术’:一个虚拟关节(dummy link)如何解决URDF惯性参数报错
机械臂仿真进阶:巧用虚拟关节解决URDF惯性参数兼容性问题 在机械臂开发过程中,URDF(Unified Robot Description Format)作为ROS生态中的标准机器人描述格式,承载着模型结构、运动学和动力学参数等重要信息。然而&#…...
解构PDF数据壁垒:Tabula如何重塑信息提取工作范式
解构PDF数据壁垒:Tabula如何重塑信息提取工作范式 【免费下载链接】tabula Tabula is a tool for liberating data tables trapped inside PDF files 项目地址: https://gitcode.com/gh_mirrors/ta/tabula 在数字信息时代,PDF文件作为文档交换的标…...
实习08-Mamba 和 SSM
🔹 第一部分:Mamba 基础概念(先补地基) 1.1 什么是 State Space Model (SSM)? [公式] - SSM 思想 SSM 源自控制理论,核心是一个连续时间系统: # 连续形式(控制理论) h(t)…...
TensorFlow Lite 实战宝典:解锁移动端AI部署的五大核心策略
1. 模型量化:让AI模型在移动端"瘦身"的魔法 第一次把ResNet50模型塞进手机时,我盯着那个178MB的大家伙直发愁——这体积都快赶上半个App了!直到发现TensorFlow Lite的量化工具,才明白原来模型也能像减肥一样"瘦身&…...
灾难恢复演练:跨地域备份与数据一致性保证
灾难恢复演练:跨地域备份与数据一致性保证 在数字化时代,数据已成为企业的核心资产。自然灾害、网络攻击或人为失误可能导致数据丢失或服务中断,给企业带来巨大损失。为确保业务连续性,灾难恢复演练成为企业不可或缺的一环。其中…...
