09 事务和连接池

news2024/11/15 8:45:31

文章目录

    • 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();
    @Override
    public int getBalance(int id) {
        return 0;
    }

    @Override
    public 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 {
    @Override
    public 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;
    }

    @Override
    public 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 {
    @Override
    public 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;
    }

    @Override
    public int addMoney(int id, int money) {
        return 0;
    }
}

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

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

相关文章

innovus中path group 的策略和应用(下)

BPG&#xff08;basic path group&#xff09;和PG&#xff08;path group&#xff09;的异同 INVS默认使用了BPG&#xff0c;但是基于SDC理论下PG&#xff08;path group&#xff09;也是天然存在&#xff0c;两者在数据库里边有各自存在的方式&#xff0c;也可以共融共生中&…

100个openharmony开源demo:1.日历

准备用开发者手机写100个开源的demo不知道能不能实现&#xff0c;日拱一卒&#xff0c;期待蜕变。 第一个demo&#xff1a;日历&#xff0c;借鉴了网上的日历算法&#xff0c;自己用arkts写了界面和点击事件&#xff0c;各位可根据此demo写自己的日历选择器等组件。 1.目录结…

【JAVA笔记】IDEA配置本地Maven

文章目录 1 配置本地Maven1.1 Maven下载1.2 Maven安装与配置1.2.1 安装1.2.2 配置1.2.2.1 环境配置1.2.2.2 本地仓库配置 2 IDEA设置本地Maven 1 配置本地Maven 1.1 Maven下载 官网&#xff1a;http://maven.apache.org/下载地址&#xff1a;http://maven.apache.org/downloa…

SinoDB客户端工具dbaccess

类似Oracle的客户端工具sqlplus&#xff0c;Mysql的客户端工具mysql&#xff0c;SinoDB数据库也有自带的命令行客户端工具dbaccess。 dbaccess 识别用户输入&#xff0c;将用户输入的 SQL 语句打包发送给 SinoDB 数据库服务器执行&#xff0c;然后接收服务器的执行结果&#xf…

windows上打开redis服务闪退问题处理

方法1&#xff1a;在windows上面打开redis服务时&#xff0c;弹窗闪退可能是6379端口占用&#xff0c;可以用以下命令查看&#xff1a; netstat -aon | findstr 6379 如果端口被占用可以用这个命令解决&#xff1a; taskkill /f /pid 进程号 方法2&#xff1a; 可以使用…

Java特性之设计模式【装饰器模式】

一、装饰器模式 概述 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属于结构型模式&#xff0c;它是作为现有的类的一个包装 装饰器模式通过将对象包装在装饰器类中&#xff0c;以…

数据泄露问题怎么解决?迅软DSE加密软件助您守护重要信息

企业信息泄露的危害 企业数据泄露事件不仅给企业带来了经济损失和声誉损害&#xff0c;还可能导致用户个人信息的泄露&#xff0c;引起社会广泛关注。 因此&#xff0c;企业需要采取更加严格的数据保护措施&#xff0c;使用数据加密系统以防范潜在的数据泄露风险。同时&#…

Vue.js前端开发零基础教学(三)

目录 2.6 计算属性 2.7侦听器 2.8 样式绑定 2.8.1 绑定class属性 2.8.2 绑定style属性 2.9 阶段案例——学习计划表 2.6 计算属性 概念&#xff1a;Vue提供了计算属性来描述依赖响应式数据的复杂逻辑。 计算属性可以实时监听数据的变化&#xff0c;返回一个计算…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

智慧商显安卓主板MT8788_联发科MTK平台多媒体广告一体机方案

MT8788高性能智能主板&#xff0c;支持Android 9.0操作系统&#xff0c;支持双屏异显功能;MT8788是基于12nm工艺制程四核A73四核A53架构的八核心CPU,主频高达2.0GHz,拥有超强的通用计算性能。 MT8788主板采用10层二阶超高密度PCB板,集成了4G、百兆以太网、2.4G/5G 双频WiFi、蓝…

C# xaml框架以及Java的ORM介绍

c#有ASP.Net,.NET以及EF Core这几个重要的运行时和框架.分别用于web,应用以及数据库的ORM. 目前跨平台的有Avalonia UI,.Net MAUI以及Uno Platform,至于WPF等本身不是跨平台的,但可以依靠其他库实现跨平台.这里面Avalonia应该是认为bug比较少的. 当然目前最火的跨平台解决方案…

Python使用指定端口进行http请求的例子

使用requests库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class SourcePortAdapter(HTTPAdapter): """"Transport adapter" that allows us to set the source port.""" def __init__(self, port, *args, **kwargs): self.poolm…

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障&#xff0c;导致上层服务故障&#xff0c;并且这个故障不断放大的过程&#xff0c;成为雪崩效应。 雪崩效应&#xff0c;往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池&#xff0c;线程池满…

数据结构的概念大合集06(树和二叉树)

概念大合集06 1、树1.1 树的相关定义1.2 树的基本运算1.3 树的基本术语1.3.1 结点的度&#xff0c;树的度1.3.2 分支结点&#xff0c;叶子节点1.3.3 路径&#xff0c;路径长度1.3.4 孩子结点&#xff0c;双亲结点&#xff0c;兄弟结点1.3.5 结点层次&#xff0c;树的高度1.3.6 …

24.两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

DELL交换机清空配置S4128T

备份配置 show run | no-more show inventory | no-more show environment | no-more show system brief | no-more -------------- 清除数据 delete startup-config system "sudo -i" //输入密码 rm -rf /config/etc/opt/dell/os10/db_init/startup.xml rm…

基于SpringBoot和Vue的大学生租房系统的设计与实现

今天要和大家聊的是一款今天要和大家聊的是一款基于SpringBoot和Vue的大学生租房系统的设计与实现。 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同…

【Java11下载、安装、部署指南】

oracle jdk11下载 oracle jdk所有版本归档【archive】下载地址&#xff1a; https://www.oracle.com/java/technologies/downloads/archive/ oracle jdk11下载地址&#xff1a; https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html 配置或修改wi…

【Python + Django】启动简单的文本页面

前言&#xff1a; 为了应付&#xff08;bushi&#xff09;毕业论文&#xff0c;总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识&#xff0c;这也算是为自己的测试经历增添光彩吧&#xff01;&#xff01;&#xff01; 希望、希望大家…

MySQL 字段定义时的属性设置

开发的时候第一步就是建表&#xff0c;在创建表的时候&#xff0c;我们需要定义表的字段&#xff0c;每个字段都有一些属性&#xff0c;比如说是否为空&#xff0c;是否允许有默认值&#xff0c;是不是逐渐等。 这些约束字段的属性&#xff0c;可以让字段的值更符合我们的预期&…