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 }