zoukankan      html  css  js  c++  java
  • java-结合c3p0封装的db 事务 类

    将Connection对象,绑定到当前线程中去,这样在每一个方法中都能使用这个链接。

    DataSourceUtils.java

    package com.itheima.utils;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    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
    	 *            连接
    	 * @param st
    	 *            语句执行者
    	 * @param rs
    	 *            结果集
    	 */
    	public static void closeResource(Connection conn, Statement st, ResultSet rs) {
    		closeResource(st, rs);
    		closeConn(conn);
    	}
    	
    	 
    	public static void closeResource(Statement st, ResultSet rs) {
    			closeResultSet(rs);
    			closeStatement(st);
    	}
    
    	/**
    	 * 释放连接
    	 * 
    	 * @param conn
    	 *            连接
    	 */
    	public static void closeConn(Connection conn) {
    		if (conn != null) {
    			try {
    				conn.close();
    				//和当前的线程解绑
    				tl.remove();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    			conn = null;
    		}
    
    	}
    
    	/**
    	 * 释放语句执行者
    	 * 
    	 * @param st
    	 *            语句执行者
    	 */
    	public static void closeStatement(Statement 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;
    		}
    
    	}
    	
    	/**
    	 * 开启事务
    	 * @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();
    		}
    	}
    	
    	/**
    	 * 事务回滚
    	 */
    	public static void rollbackAndClose(){
    		try {
    			//获取连接
    			Connection conn = getConnection();
    			//事务回滚
    			conn.rollback();
    			//释放资源
    			conn.close();
    			//解除绑定
    			tl.remove();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
  • 相关阅读:
    强化学习课程学习(2)——必备数学基础集锦
    强化学习课程学习(1)——深度学习前期回顾
    疑难杂症-使用pandas_profiling查看EDA数据文档遇到的一些坑
    YOLOv3的论文详解
    YOLO2——YOLO9000,Better, Faster, Stronger论文详解
    YOLO——You Only Look Once论文详解
    第十二章-自我总结
    第十一章-CRF的奇妙之处
    nodejs Sequelize CLI Access denied for user 'root'@'localhost' (using password: NO)
    (52)指针 (53)数组的增删改查
  • 原文地址:https://www.cnblogs.com/hfultrastrong/p/7324830.html
Copyright © 2011-2022 走看看