JDBC:编写通用的 JDBCUtils工具类

基本上已经可以应付常用方法

1.为JDBCUtils 添加事务处理方法

2.处理多线程并发访问问题


package cn.cil.Utls;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;

/**
 * 编写通用的 JDBCUtils 工具类
 * @author Administrator
 *
 */

public class JDBCUtiles1 {

	/** 使用 c3p0 数据源 */
	
	private static DataSource dataSource = null;
	
	/** 使用ThreadLocal 解决多线程并发访问问题 
	 * 	其中存放的是,事务处理相关的 Connection 对象*/
	private static ThreadLocal<Connection> locals = null;
	
	/** 创建对象 */
	static{
		dataSource = new ComboPooledDataSource("c3p0Config");
		locals = new ThreadLocal<>();
	}
	
	/**
	 * 获取 数据库连接
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		
		// 获取当前线程对应的连接,也就是当前访问的数据库连接
		Connection conn = locals.get();
		// 如果为空,说明没有开启事务,则返回空闲 连接
		// 不为空,说明正在进行事务,所以必须是同一连接
		return (conn != null)?conn:dataSource.getConnection();
	}
	
	/**
	 * 开始事务
	 * @throws SQLException
	 */
	public static void beginStraction() throws SQLException{
		Connection conn = locals.get();
		//如果本次访问,已经开始事务了,却再次开始事务,即上次事务还没有进行完,又开始事务,则抛出
		if(conn != null)throw new SQLException("已经开始了事务");
		conn = getConnection();
		conn.setAutoCommit(false);
		locals.set(conn); //向 ThreadLocal 填充 数据库连接
		
	}
	
	/**
	 * 提交事务
	 * @throws SQLException
	 */
	public static void commitStraction() throws SQLException{
		Connection conn = locals.get();
		// 判断事务是否开始了,如果还没有开始事务,则不能提交
		if(conn == null)
			throw new SQLException("还没有开始事务");
		conn.commit();
		conn.close();
		locals.remove();//移走
	}
	
	/**
	 * 回滚事务
	 * @throws SQLException
	 */
	public static void rollbackStraction() throws SQLException{
		Connection conn = locals.get();
		if(conn == null)
			throw new SQLException("无法回滚事务");
	
		conn.rollback();
		conn.close();
		locals.remove();
	}
	
	/**
	 * 释放 连接,归还连接池
	 * @param connection
	 * @throws SQLException
	 */
	public static void release(Connection connection) throws SQLException{
		
		Connection conn = locals.get();
		if(conn == null){
			connection.close();
		}
		if(conn != connection){
			connection.close();
		}
		
	}
	/**
	 * 释放 连接,关闭结果集
	 * @param connection
	 * @throws SQLException
	 */
	public static void relase(Connection connection,ResultSet rs) throws SQLException{
		release(connection);
		if(rs != null){
			rs.close();
		}
	}
	
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。