/**异常:程序在运行过程中的特殊情况 * 1)受检异常:(要求程序必须捕获或者声明抛出异常。) * 放在方法和参数的后面,用throws声明, * 2)运行时异常:(默认情况下会得到自动处理,所以不用通常捕获。) * 算术异常、类型转换异常、数组下标越界、空指针异常、输入不匹配异常 * 当语句可能存在异常时,try{异常语句} catch(){隔离异常} * 多重catch:需要考虑异常的子父类关系 子类在上 父类在下 * 执行顺序:try语句块->相应的catch语句块-->finally语句块-->执行到最后 */
1 public class UnusualTest { 2 private static ThreadLocaltl = new ThreadLocal<>(); 3 private static DataSource dataSource; 4 //连接数据库 5 public static Connection getConnection(){ 6 Connection conn = null; 7 //当语句可能存在异常时,try{异常语句} catch(){隔离异常} 8 try { 9 conn = tl.get(); 10 if(conn==null){ 11 conn = dataSource.getConnection(); 12 tl.set(conn); 13 } 14 } catch (SQLException e) { 15 e.printStackTrace(); 16 } 17 return conn; 18 } 19 //断开数据库 20 public static void closeAll(AutoCloseable... cs){ 21 for(AutoCloseable c : cs){ 22 if(c!=null){ 23 try { 24 c.close(); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 } 29 } 30 } 31 //开启事务 32 public static void begin(){ 33 Connection conn = getConnection(); 34 try { 35 conn.setAutoCommit(false); 36 } catch (SQLException e) { 37 e.printStackTrace(); 38 } 39 } 40 //提交事务 41 public static void commit(){ 42 Connection conn = getConnection(); 43 try { 44 conn.commit(); 45 } catch (SQLException e) { 46 e.printStackTrace(); 47 } 48 closeAll(conn); 49 tl.remove(); 50 } 51 //事务回滚 52 public static void rollback(){ 53 Connection conn = getConnection(); 54 try { 55 conn.rollback(); 56 } catch (SQLException e) { 57 e.printStackTrace(); 58 } 59 closeAll(conn); 60 tl.remove(); 61 } 62 }