• JdbcUtils


     1 package jdbc;
     2 
     3 import com.mchange.v2.c3p0.ComboPooledDataSource;
     4 
     5 import java.sql.Connection;
     6 import java.sql.SQLException;
     7 
     8 /**
     9  * Created by Mac on 10/09/2017.
    10  *
    11  * @kong
    12  */
    13 public class JdbcUtils {
    14     //配置文件的默认配置,要求你必须给出从c3p0-config.xml
    15     private static ComboPooledDataSource  dataSource = new ComboPooledDataSource();
    16 
    17     //事务专用连接
    18     private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
    19 
    20     //使用连接池返回一个连接对象
    21     public static Connection getConnection() throws SQLException {
    22         Connection con = tl.get();
    23         //当con不等于null,说明已经调用过beginTransaction(),表示开启了事务
    24         if(con != null)return con;
    25         return dataSource.getConnection();
    26     }
    27     //返回连接池对象
    28     public static ComboPooledDataSource getDataSource() {
    29         return dataSource;
    30     }
    31     /*
    32     * 开启事务
    33     * 1、获取一个Connection,设置它的setAutoCommit(false)
    34     * 2、还要保证dao中使用的连接是我们刚刚创建的
    35     * ------------
    36     * 1、创建一个Connection,设置为手动提交
    37     * 2、把这个Connection给dao用
    38     * 3、还要让commitTransaction或rollbackTransaction可以获取到
    39     * */
    40     public static void beginTransaction() throws SQLException {
    41         Connection con = tl.get();
    42         if (con != null) throw new SQLException("已经开启了事务,就不要重新开启了");
    43         /*
    44         * 1、给con赋值
    45         * 2、给con设置为手动提交
    46         * */
    47         con = getConnection();//给con赋值,表示事务已经开始了
    48         con.setAutoCommit(false);
    49 
    50         tl.set(con);//把当前线程的连接保存起来
    51     }
    52     /*
    53     * 提交事务
    54     * 1、获取beginTransaction提供的Connection,然后调用Commit()方法
    55     * */
    56     public static void commitTransaction() throws SQLException {
    57         Connection con = tl.get();//获取当前线程的专用连接
    58         if (con == null) throw new SQLException("还没有开启事务,不能提交!");
    59         /*
    60         * 1、直接使用con.commit()
    61         * */
    62         con.commit();
    63         con.close();
    64         //把它设置为null,表示事务已经结束了,下次再去调用getConnection()返回的就不是con了
    65        tl.remove();//从tl中移除连接。
    66     }
    67     /*
    68     * 提交事务
    69     * 1、获取beginTransaction提供的Connection,然后调用rollbacK()方法
    70     * */
    71     public static void rollbackTransaction() throws SQLException {
    72         Connection con = tl.get();
    73         if (con == null) throw new SQLException("还没有开启事务,不能滚回!");
    74         /*
    75         * 1、直接使用con.rollback()
    76         * */
    77         con.rollback();
    78         con.close();
    79         tl.remove();
    80     }
    81     /*
    82     * 释放连接
    83     * */
    84     public static void releaseConnection(Connection connection)throws SQLException{
    85         Connection con = tl.get();
    86         /*
    87         * 判断它是否是事务专用,如果是,就不关闭
    88         * 如果不是事务专用,那就要关闭
    89         * */
    90         //如果con == null,说明现在没有事务,那么connection一定不是事务专用的
    91         if(con == null) connection.close();
    92         //如果con != null,说明有事务,那么需要判断连接是否与con相等,若不等,说明参数连接不是事务专用连接
    93         if (con != connection) connection.close();
    94     }
    95 }
  • 相关阅读:
    [NOI Online 2021 提高组] 愤怒的小 N
    CF1474F 1 2 3 4 ...
    CF1466H Finding satisfactory solutions
    CF1336F Journey
    [PKUSC2021]代金券
    如何科学地设计对拍随机种子
    CF1168E Xor Permutations
    「JOISC 2019 Day2」两种运输
    springboot json参数
    springboot整合webserver应用
  • 原文地址:https://www.cnblogs.com/gdwkong/p/7633254.html
Copyright © 2020-2023  润新知