您好,登錄后才能下訂單哦!
我們都知道在javaee實際開發(fā)中,分為3層結構來開發(fā),controller,service和dao
那么為什么事物要存在于業(yè)務層中,事物是通過connection對象操作的,使用原始jdbc鏈接數據庫的鏈接也是connection操作的,connection是在到是怎么傳遞到dao的呢?
這里講解兩種方式
第一種通過形式參數的方式
第二種通過ThreadLocal的方式
ThreadLocal的底層是個map,該map的key是固定的,當前線程。value可以讓我們存入任意對象
public class JdbcUtils {
// 成員變量,創(chuàng)建了C3P0的連接池(連接池中已經存在連接了...)
private static final ComboPooledDataSource DATASOURCE = new ComboPooledDataSource();
// 把Connection綁定到當前的線程中
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
/**
* 返回的是C3P0的連接池
* @return
*/
public static DataSource getDataSource(){
return DATASOURCE;
}
/**
* 獲取連接,返回連接
* @return
* @throws SQLException
*/
public static Connection getConnection() throws SQLException{
Connection conn = null;
// 從tl中獲取
conn = tl.get();
if(conn == null){
// 從連接池中獲取連接
conn = DATASOURCE.getConnection();
// 非常關鍵,把連接存入到tl中
tl.set(conn);
}
return conn;
}
/**
* 開啟事務
* @throws SQLException
*/
public static void beginTransaction() throws SQLException{
// 調用getConnection()
Connection conn = getConnection();
conn.setAutoCommit(false);
}
/**
* 提交事務
* @throws SQLException
*/
public static void commitTransaction() throws SQLException{
// 調用getConnection()
Connection conn = getConnection();
conn.commit();
}
/**
* 回滾事務
* @throws SQLException
*/
public static void rollBackTransaction() throws SQLException{
// 調用getConnection()
Connection conn = getConnection();
conn.rollback();
}
/**
* 歸還連接
* @throws SQLException
*/
public static void closeConn() throws SQLException{
// 調用getConnection()
Connection conn = getConnection();
conn.close();
tl.remove();
}
/**
* 釋放資源
* @param stmt
* @param conn
*/
public static void release(Statement stmt,Connection conn){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
// 已經變成了歸還了...
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 釋放資源
* @param stmt
* @param conn
*/
public static void release(ResultSet rs,Statement stmt,Connection conn){
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
// 把close()給修改了,原來是銷毀連接,現在讓方法變成歸還連接。
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。