开发者学堂课程【JDBC 数据库开发进阶:JdbcUtils 处理多线程并发访问问题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/32/detail/694
JdbcUtils 处理多线程并发访问问题
内容简介:
相关代码
相关代码
package cn.itcast.jdbc;
import java.sql.connection;
public class JdbcUtils {
//配置文件的默认配置!要求你必须给出c3p0-config.xml! ! !
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
//它是事务专用连接!
private static connection con = null;
/**
使用连接池返回一个连接对象
*@return
*@throws SQLException
*/
public static Connection getConnection( ) throws sQLException {
//当con不等于null,说明已经调用过beginTransaction (),表示开启了事务!if( con != null) return con;
return datasource.getconnection ();
}
*使用连接池返回一个连接对象
*@return
*@throws SQLException
*/
public static connection getconnection() throws sQLException {
//当con不等于null,说明已经调用过beginTransaction ( ),表示开启了事务!
if ( con != null) return con;
return datasource.getConnection () ;
}
/**
*返回连接池对象!
*/return
*/
public static Datasource getDatasource () {
return datasource;
}
/**
*开启事务
*1.获取一个connection,设置它的setautoComnrnit (false)
*2.还要保证dao中使用的连接是我们刚刚创建的!
*--------------
*1.创建一个connection,设置为手动提交
*2.把这个connection给dao用!
*3.还要让conitTransaction或rollbackTransaction可以获取到!
*@throws sQLException
*/
public static void beginTransaction()throws sQLException {
if(con != null) throw new sQLException("已经开启了事务,就不要重复开启了!");
/*
*1.给con赋值!
*2.给con设置为手动提交!
*/
con = getconnection( ) ; //给con赋值,表示事务已经开始了con.setAutoCormit (false) ;
}
tl.set (con);//把兰刖线程的连接保仔起米!
}
/**
*提交事务
*1.获取beginTransaction提供的connection,然后调用commit方
法/*@throws SQLException
*/
public static void commitTransaction() throws sQLException {
if(con == null) throw new SQLException ("还没有开启事务,不能提交! ");
/*
*1.直接使用con. commit ()
*/
con- commit ();
con.close ();
//把它设置为null,表示事务已经结束了!下次再去调用getConnection ()返回的就不是gon 了son.= null;
}
/**
*提交事务
*1.获取beginTransaction提供的connection,然后调用rollback方法
throws SQLException
*/
public static void rollbackTransaction () throws sQLException {
Connection con =
if(con == null) throw new sQLException ("还没有开启事务,不能回滚!");
/*
*1.直接使用con.rollback ()
*/
Con.rollback ();
con.-close () ;
con= null;
}
/**
*释放连接
*@param connection
*@throws sQLException
*/
public static void releaseConnection(Connection connection) throws SQLException
Connection con = tl.get ();
/*
*判断它是不是事务专用,如果是,就不关闭!
*如果不是事务专用,那么就要关闭!
*/
//如果con == null,说明现在没有事务,那么connection一定不是事务专用的!
if(con ==null) connection.close () ;
//如果con != null,说明有事务,那么需要判断参数连接是否与con相等,若不等,说明参数连接不
if(con != connection) connection.close() ;
}
package cn.itcast.jdbc;
import java.sql.sQIException;
public class Demo1 {
private AccountDao dao = new AccountDao ( );
@Test
public void serviceMethod ( ) {
try {
JdbcUtils.beginTransaoction( ) ;
dao.update.("zs",-1.00);
if(true) throw new RuntimeException ( ;
dao.update(".ls"...100);
JdbcUtils.oommitTransaction ( ) ;
}catch(Exception e) {
try {
JdbcUtils. rollbackTransaction ( ) ;
catch isOLException e1) {