首页 > 其他分享 >09 事务和连接池

09 事务和连接池

时间:2024-03-22 23:34:07浏览次数:20  
标签:事务 dao int 09 connection import com aistart 连接池

文章目录


事务和连接池

连接池类:
创建线程池静态常量,用于放连接。
创建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;
    }
}

标签:事务,dao,int,09,connection,import,com,aistart,连接池
From: https://blog.csdn.net/m0_46695127/article/details/136919489

相关文章

  • 关于并发编程一些问题与解决--事务回滚@Transactional
    先贴一下代码吧@Transactional@OverridepublicintupSunp(Integera_id){//查询数据库QueryWrapper<Animal>animalQueryWrapper=newQueryWrapper<>();animalQueryWrapper.eq("a_id",a_id);Animalanima......
  • 【新品播报】米尔电子发布基于海思Hi3093高性能MPU产品
    新品播报!米尔电子发布了基于海思Hi3093高性能MPU的MYC-LHi3093核心板及开发板,此款核心板支持openEulerembeddedOS欧拉系统,丰富生态,可实现100%全国产自主可控。不仅如此,米尔基于Hi3093的核心板及开发板,配套提供工业控制demo,方便客户评估PLC等应用场景实时控制性能,为追求实时性......
  • k8s证书监控--x509-certificate-exporter
    目录k8s证书监控--x509-certificate-exporter一、下载并解压二、推送镜像到镜像仓库三、根据实际情况修改values.yaml,其他配置可不做修改四、配置监控以及告警五、异常处理k8s证书监控--x509-certificate-exporter一、下载并解压下载并解压helm包x509-certificate-exporter-3.1......
  • 事务、索引、视图、数据库备份和恢复
    事务#创建银行卡CREATEtableaccount(cidintUNIQUE,cnameVARCHAR(20),moneyDECIMAL(10,2)UNSIGNED)INSERTintoaccountVALUES(12345,'李嘉欣',1000);INSERTintoaccountVALUES(12346,'徐杰',2000);#管理手动事务的语句/*开启事务BEGIN  提交事务CO......
  • 关于RK1808/RK1806和RV1109/RV1126 NPU升级方法
    一、注意事项本工程主要为RockchipNPU提供驱动、示例等。**RK3399Pro用户态的库及驱动不在本工程**,请参考:https://github.com/airockchip/RK3399Pro_npuRK3566/RK3568/RK3588/RV1103/RV1106请参考:https://github.com/rockchip-linux/rknpu2二、RKNNToolkit在使用RKNNA......
  • Java使用数据库连接池
    一、原生JDBC操作数据库的步骤(1)加载数据库驱动。(2)获取数据库连接。(3)预编译SQL语句。(4)执行SQL。(5)获取结果集。(6)释放资源。示例代码如下:publicclassJDBCTest{    publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException......
  • Oracle WebLogic Server JNDI注入漏洞(CVE-2024-20931)复现
    先从镜像站拉取OracleWebLogicServerJNDI注入漏洞(CVE-2024-20931)然后在docker中启动这个镜像即可在网页中访问,搭建网站成功使用利用工具来进行验证是否存在漏洞获取DNS查看是否有回显有回显漏洞存在创造反弹shell,先查看攻击机的ip进行反弹shell编码使用nc开启监听端......
  • redis——集合,有序,慢查询, pipline与事务, bitmap ,HyperLogLog geo
    集合类型(set)saddkeyelement#向集合key添加element(如果element存在,添加失败)o(1)sremkeyelement#从集合中的element移除掉o(1)scardkey#计算集合大小sismemberkeyelement#判断element是否在集合中srandmemberkeycount#从集合中随机取出count个元素,不会破坏集......
  • mybatis注解开发和事务配置以及mybatis缓存
    MyBatis注解开发注解方式比较简单,但是实际开发不推荐使用注解,使用配置文件的方式,不需要改源代码。@Insert:添加@Update:修改@Delete:删除@Select:查询@Result:实现结果集封装@Results:可以和@Result一起使用,封装多个结果集@One:实现一对一和多对一的结果集封装@Man......
  • 多数据源,手动事务注解
    获取容器中的bean@ComponentpublicclassApplicationContextUtilimplementsApplicationContextAware{publicstaticApplicationContextapplicationContext;@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBe......