绑定线程代码实现

本文介绍了Java中ThreadLocal的使用,包括构造、set、get和remove方法,并展示了如何结合C3P0数据源创建线程绑定的连接池,确保每个线程拥有独立的数据库连接,最后提供了关闭资源的辅助方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绑定线程代码实现

ThreadLocal的方法:
        构造:
            new ThreadLocal()
        set(Object value):将内容和当前线程绑定
        Object get():获取和迪昂前线程绑定的内容
        remove():将当前线程和内容解绑
    内部维护了map集合
        map.put(当前线程,内容);
        map.get(当前线程)

        map.remove(当前线程)

代码

package com.feizhu.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {
      
      private static ComboPooledDataSource ds=new ComboPooledDataSource();
      
      private static ThreadLocal<Connection> tl=new ThreadLocal<>();
      /**
       *获取数据源
       * @return 连接
       */
       public  static DataSource getDataSource() {
           return ds;
       }
      /**
       * 从 当前线程上获取连接
       * @return
       * @throws SQLException
       */
       public static Connection getConnection() throws SQLException {
           Connection conn=tl.get();
           
           if(conn==null) {
               //第一次获取  创建一个连接和当前的线程绑定
               conn=ds.getConnection();
               
               //绑定
               tl.set(conn);
           }
           return conn;
       }
       
       /**
        * 释放连接
        * @param conn 连接
        */
       
       public static void closeConn(Connection conn) {
           if(conn!=null) {
               try {
                conn.close();
                //和当前的线程解绑
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
               conn=null;
           }
       }
       
       /**
        *释放语句执行者
        * @param st 执行者
        */
       public static void closeStatement(PreparedStatement st) {
           if(st!=null) {
               try {
                st.close();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
              st=null;
           }
       }
       
       
       /**
        *释放结果集
        * @param rs 结果集
        */
       public static void closeResultSet(ResultSet rs) {
           if(rs!=null) {
               try {
                   rs.close();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
               rs=null;
           }
       }
       
       /**
        *
        * @param conn
        * @param st
        * @param rs
        */
       public static void closeRouse(Connection conn,PreparedStatement st,ResultSet rs) {
           closeRouse(st,rs);
           closeConn(conn);
       }
       
       public static void closeRouse(PreparedStatement st,ResultSet rs) {
           closeResultSet(rs);
           closeStatement(st);
       }
       
       /**
        * 开启事物
        * @throws SQLException
        */
       public static void  startTransaction() throws SQLException {
           //获取连接//开启事物
           getConnection().setAutoCommit(false);
       }
       
       //事物提交
       public static void commitAndClose() {
            //获取连接
            try {
                Connection conn=getConnection();
           //提交事物
                conn.commit();
           //释放资源
                conn.close();  
           //解除绑定
                tl.remove();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }

       }
       
       /**
        * 事物回滚
        * @throws SQLException
        */
       
       //事物提交
       public static void rollbackAndClose() {
            //获取连接
            try {
                Connection conn=getConnection();
           //事物回滚
                conn.rollback();
           //释放资源
                conn.close();  
           //解除绑定
                tl.remove();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }

       }
}

备注:由于个人原因,本博客暂停更新。如有问题可联系本人,本人提供技术指导、学习方向、学习路线。本人微信wlp1156107728(添加注明来意)   QQ1156107728(添加注明来意)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值