使用动态代理实现用AOP对数据库进行操作
生活随笔
收集整理的這篇文章主要介紹了
使用动态代理实现用AOP对数据库进行操作
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用動態(tài)代理實現(xiàn)用AOP對數(shù)據(jù)庫進行操作
2008-03-14 11:04 作者:reverocean 來源:賽迪網(wǎng)
[摘要] 要實現(xiàn)對數(shù)據(jù)庫的操作,離不開數(shù)據(jù)源(DataSource)或者連接(Connection),但是通常來說對數(shù)據(jù)庫的操作都應(yīng)該放在DAO中,而DAO又不應(yīng)該與應(yīng)用服務(wù)器相關(guān)聯(lián),所以一般都使用連接(Connection)。 [關(guān)鍵字] 動態(tài)代理 AOP 數(shù)據(jù)庫
要實現(xiàn)對數(shù)據(jù)庫的操作,離不開數(shù)據(jù)源(DataSource)或者連接(Connection),但是通常來說對數(shù)據(jù)庫的操作都應(yīng)該放在DAO中,而DAO又不應(yīng)該與應(yīng)用服務(wù)器相關(guān)聯(lián),所以一般都使用連接(Connection)。現(xiàn)在我們這里就有一個問題了,怎么在攔截器中獲得連接。我想可以通過兩種方式獲得:
在分別討論這兩種方法之前,我們需要先討論一下在處理數(shù)據(jù)庫的時候的異常的處理。我這里做了一個TransactionException繼承至RuntimeException然后在攔截器里面拋出,再又應(yīng)用框架處理這個異常。下面試這個類的代碼:
public class TransactionException extends RuntimeException {
private Throwable superException;
private String myMessage;
public TransactionException(Throwable throwable){
super(throwable);
this.superException = throwable;
}
public TransactionException(Throwable throwable,String message){
super(message,throwable);
this.superException = throwable;
this.myMessage = message;
}
/**
* @return Returns the myMessage.
*/
public String getMessage() {
return myMessage;
}
/**
* @return Returns the superException.
*/
public Throwable getSuperException() {
return superException;
}
/**
* @param myMessage The myMessage to set.
*/
public void setMyMessage(String message) {
this.myMessage = message;
}
/**
* @param superException The superException to set.
*/
public void setSuperException(Throwable superException) {
this.superException = superException;
}
}
1) 通過方法的第一個參數(shù)傳進去
l DAO
import java.sql.Connection;
public class TestDao {
public void insertA(Connection con,String a,String b,……){
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
}
l 攔截器
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TransactionInterceptor implements Interceptor {
public void before(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new TransactionException(e);
}
}
}
public void after(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.commit();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
public void exceptionThrow(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.rollback();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
private List getNeedTransaction(){
List needTransactions = new ArrayList();
needTransactions.add("insert");
needTransactions.add("update");
return needTransactions;
}
private boolean isNeedTransactions(InvokeJniInfo invInfo){
String needTransaction = "";
List needTransactions = getNeedTransaction();
for(int i = 0;i needTransaction = (String)needTransactions.get(i);
if(invInfo.getMethod().getName().startsWith(needTransaction)){
return true;
}
}
return false;
}
}
需要注意的是:getNeedTransaction就是需要進行事務(wù)處理的方法的開頭,這個方法可以寫成一個從配置文件里面去讀,這里我就寫死在里面了。只是對insert和update開頭的方法進行事務(wù)控制。
2) 將Connection對象放在ThreadLocal中
l ConnectionUtil類:
import java.sql.Connection;
public final class ConnectionUtil {
private static ThreadLocal connections = new ThreadLocal();
public static Connection getConnection(){
Connection conn = null;
conn = (Connection) connections.get();
if(conn == null){
conn = getRealConnection();
connections.set(conn);
}
return conn;
}
public static void realseConnection(Connection conn){
connections.set(null);
}
private static Connection getRealConnection() {
實現(xiàn)自己獲取連接的代碼
return null;
}
}
l DAO類
public class TestDao {
public void insertA(String a,String b){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
Connection conn = getConnection();
………………………………………
1 2 下一頁>>
關(guān)鍵詞: 動態(tài)代理, AOP, 數(shù)據(jù)庫,
* 相關(guān)文章
1、使用“DB2”數(shù)據(jù)庫臨時表的6個注意事項
2、大型數(shù)據(jù)庫的設(shè)計原則與開發(fā)技巧
3、如何從數(shù)據(jù)庫查詢結(jié)果集中獲得隨機結(jié)果
4、關(guān)于Access數(shù)據(jù)庫4種安全方式
5、講解SQL Server 2005數(shù)據(jù)庫的同義詞Bug
6、如何防止插入刪除表造成的數(shù)據(jù)庫死鎖
7、詳細(xì)講解Oracle表分區(qū)相關(guān)概念及優(yōu)點
8、詳細(xì)講解各種數(shù)據(jù)庫使用JDBC連接的方式
9、數(shù)據(jù)庫相關(guān)--Hibernate的事務(wù)和并發(fā)
10、Linux系統(tǒng)安全機制進階分析
11、安全的配置和應(yīng)用MySQL數(shù)據(jù)庫
12、哪些因素可以影響Oracle數(shù)據(jù)庫的性能
13、SQL端口改變后的遠程連接和數(shù)據(jù)庫連接
14、Delphi編程:三層數(shù)據(jù)庫構(gòu)架實例解析
15、對一些代碼加密后再放到Oracle數(shù)據(jù)庫中
16、SQL Server 2008關(guān)系數(shù)據(jù)庫引擎新增功能
17、J2EE綜合:業(yè)務(wù)邏輯和數(shù)據(jù)庫的訪問決策
18、J2EE綜合--業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問決策
19、融會貫通Oracle數(shù)據(jù)庫的25條基本知識
20、exp的版本高于數(shù)據(jù)庫版本導(dǎo)出時出現(xiàn)報錯
21、使用“DB2”數(shù)據(jù)庫臨時表的6個注意事項
* 我要留言
論壇焦點
*
* PLSQL程序設(shè)計
*
* 經(jīng)典資料3----oracle培訓(xùn)18天老師
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函數(shù)大全
*
* 提供點ORACLE9i_優(yōu)化設(shè)計與系統(tǒng)調(diào)整
*
* ORACLE初始化參數(shù)詳解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初學(xué)者的好書,圖文講解
*
* oracle超級幫助文件(中文版)-OR
*
* Oracle SQL 內(nèi)置函數(shù)大全
技術(shù)分類
* 微軟技術(shù)
* vista Windows ISA Exchange SharePoint
* Oracle
* 入門與認(rèn)證 數(shù)據(jù)庫管理 開發(fā)應(yīng)用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 數(shù)據(jù)庫
* SQL Server Sybase DB2 Access MySQL
* WEB開發(fā)
* ASP JSP PHP JavaScript VB VC
* JAVA開發(fā)
* J2SE J2EE J2ME Web Services XML
開源 SOA Eclipse Jbuilder
* NET開發(fā)
* C# J# ASP.NET VB.NET VC.NET C++
* 圖形設(shè)計
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒體技術(shù)
* Authorware MAYA 3Dmax Flash
* 虛擬技術(shù)
* vmware Virtual PC Virtuozzo xen
* 其他技術(shù)
* 中間件 嵌入式開發(fā) 移動開發(fā) 游戲開發(fā)
關(guān)于硅谷動力 | 廣告服務(wù) | 版權(quán)聲明 | 加入硅谷動力 | 聯(lián)系我們 | 建議/投訴 | 網(wǎng)站導(dǎo)航 | 加入收藏
網(wǎng)站合作、內(nèi)容監(jiān)督、商務(wù)咨詢、投訴建議:010-65245588
合作建議:hezuo@mail.enet.com.cn
2008-03-14 11:04 作者:reverocean 來源:賽迪網(wǎng)
[摘要] 要實現(xiàn)對數(shù)據(jù)庫的操作,離不開數(shù)據(jù)源(DataSource)或者連接(Connection),但是通常來說對數(shù)據(jù)庫的操作都應(yīng)該放在DAO中,而DAO又不應(yīng)該與應(yīng)用服務(wù)器相關(guān)聯(lián),所以一般都使用連接(Connection)。 [關(guān)鍵字] 動態(tài)代理 AOP 數(shù)據(jù)庫
要實現(xiàn)對數(shù)據(jù)庫的操作,離不開數(shù)據(jù)源(DataSource)或者連接(Connection),但是通常來說對數(shù)據(jù)庫的操作都應(yīng)該放在DAO中,而DAO又不應(yīng)該與應(yīng)用服務(wù)器相關(guān)聯(lián),所以一般都使用連接(Connection)。現(xiàn)在我們這里就有一個問題了,怎么在攔截器中獲得連接。我想可以通過兩種方式獲得:
在分別討論這兩種方法之前,我們需要先討論一下在處理數(shù)據(jù)庫的時候的異常的處理。我這里做了一個TransactionException繼承至RuntimeException然后在攔截器里面拋出,再又應(yīng)用框架處理這個異常。下面試這個類的代碼:
public class TransactionException extends RuntimeException {
private Throwable superException;
private String myMessage;
public TransactionException(Throwable throwable){
super(throwable);
this.superException = throwable;
}
public TransactionException(Throwable throwable,String message){
super(message,throwable);
this.superException = throwable;
this.myMessage = message;
}
/**
* @return Returns the myMessage.
*/
public String getMessage() {
return myMessage;
}
/**
* @return Returns the superException.
*/
public Throwable getSuperException() {
return superException;
}
/**
* @param myMessage The myMessage to set.
*/
public void setMyMessage(String message) {
this.myMessage = message;
}
/**
* @param superException The superException to set.
*/
public void setSuperException(Throwable superException) {
this.superException = superException;
}
}
1) 通過方法的第一個參數(shù)傳進去
l DAO
import java.sql.Connection;
public class TestDao {
public void insertA(Connection con,String a,String b,……){
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
…………………………………………
一系列操作
…………………………………………
}
}
l 攔截器
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class TransactionInterceptor implements Interceptor {
public void before(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
throw new TransactionException(e);
}
}
}
public void after(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.commit();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
public void exceptionThrow(InvokeJniInfo invInfo) {
if(isNeedTransactions(invInfo)){
Connection conn = (Connection) invInfo.getArgs()[0];
try {
conn.rollback();
} catch (SQLException e) {
throw new TransactionException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
throw new TransactionException(e,"Close Connection is failure!");
}
}
}
}
}
private List getNeedTransaction(){
List needTransactions = new ArrayList();
needTransactions.add("insert");
needTransactions.add("update");
return needTransactions;
}
private boolean isNeedTransactions(InvokeJniInfo invInfo){
String needTransaction = "";
List needTransactions = getNeedTransaction();
for(int i = 0;i needTransaction = (String)needTransactions.get(i);
if(invInfo.getMethod().getName().startsWith(needTransaction)){
return true;
}
}
return false;
}
}
需要注意的是:getNeedTransaction就是需要進行事務(wù)處理的方法的開頭,這個方法可以寫成一個從配置文件里面去讀,這里我就寫死在里面了。只是對insert和update開頭的方法進行事務(wù)控制。
2) 將Connection對象放在ThreadLocal中
l ConnectionUtil類:
import java.sql.Connection;
public final class ConnectionUtil {
private static ThreadLocal connections = new ThreadLocal();
public static Connection getConnection(){
Connection conn = null;
conn = (Connection) connections.get();
if(conn == null){
conn = getRealConnection();
connections.set(conn);
}
return conn;
}
public static void realseConnection(Connection conn){
connections.set(null);
}
private static Connection getRealConnection() {
實現(xiàn)自己獲取連接的代碼
return null;
}
}
l DAO類
public class TestDao {
public void insertA(String a,String b){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public String queryA(Connection con,…….){
Connection conn = getConnection();
…………………………………………
一系列操作
…………………………………………
}
public void updateA(Connection con,…….){
Connection conn = getConnection();
………………………………………
1 2 下一頁>>
關(guān)鍵詞: 動態(tài)代理, AOP, 數(shù)據(jù)庫,
* 相關(guān)文章
1、使用“DB2”數(shù)據(jù)庫臨時表的6個注意事項
2、大型數(shù)據(jù)庫的設(shè)計原則與開發(fā)技巧
3、如何從數(shù)據(jù)庫查詢結(jié)果集中獲得隨機結(jié)果
4、關(guān)于Access數(shù)據(jù)庫4種安全方式
5、講解SQL Server 2005數(shù)據(jù)庫的同義詞Bug
6、如何防止插入刪除表造成的數(shù)據(jù)庫死鎖
7、詳細(xì)講解Oracle表分區(qū)相關(guān)概念及優(yōu)點
8、詳細(xì)講解各種數(shù)據(jù)庫使用JDBC連接的方式
9、數(shù)據(jù)庫相關(guān)--Hibernate的事務(wù)和并發(fā)
10、Linux系統(tǒng)安全機制進階分析
11、安全的配置和應(yīng)用MySQL數(shù)據(jù)庫
12、哪些因素可以影響Oracle數(shù)據(jù)庫的性能
13、SQL端口改變后的遠程連接和數(shù)據(jù)庫連接
14、Delphi編程:三層數(shù)據(jù)庫構(gòu)架實例解析
15、對一些代碼加密后再放到Oracle數(shù)據(jù)庫中
16、SQL Server 2008關(guān)系數(shù)據(jù)庫引擎新增功能
17、J2EE綜合:業(yè)務(wù)邏輯和數(shù)據(jù)庫的訪問決策
18、J2EE綜合--業(yè)務(wù)邏輯和數(shù)據(jù)庫訪問決策
19、融會貫通Oracle數(shù)據(jù)庫的25條基本知識
20、exp的版本高于數(shù)據(jù)庫版本導(dǎo)出時出現(xiàn)報錯
21、使用“DB2”數(shù)據(jù)庫臨時表的6個注意事項
* 我要留言
論壇焦點
*
* PLSQL程序設(shè)計
*
* 經(jīng)典資料3----oracle培訓(xùn)18天老師
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函數(shù)大全
*
* 提供點ORACLE9i_優(yōu)化設(shè)計與系統(tǒng)調(diào)整
*
* ORACLE初始化參數(shù)詳解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初學(xué)者的好書,圖文講解
*
* oracle超級幫助文件(中文版)-OR
*
* Oracle SQL 內(nèi)置函數(shù)大全
技術(shù)分類
* 微軟技術(shù)
* vista Windows ISA Exchange SharePoint
* Oracle
* 入門與認(rèn)證 數(shù)據(jù)庫管理 開發(fā)應(yīng)用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 數(shù)據(jù)庫
* SQL Server Sybase DB2 Access MySQL
* WEB開發(fā)
* ASP JSP PHP JavaScript VB VC
* JAVA開發(fā)
* J2SE J2EE J2ME Web Services XML
開源 SOA Eclipse Jbuilder
* NET開發(fā)
* C# J# ASP.NET VB.NET VC.NET C++
* 圖形設(shè)計
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒體技術(shù)
* Authorware MAYA 3Dmax Flash
* 虛擬技術(shù)
* vmware Virtual PC Virtuozzo xen
* 其他技術(shù)
* 中間件 嵌入式開發(fā) 移動開發(fā) 游戲開發(fā)
關(guān)于硅谷動力 | 廣告服務(wù) | 版權(quán)聲明 | 加入硅谷動力 | 聯(lián)系我們 | 建議/投訴 | 網(wǎng)站導(dǎo)航 | 加入收藏
網(wǎng)站合作、內(nèi)容監(jiān)督、商務(wù)咨詢、投訴建議:010-65245588
合作建議:hezuo@mail.enet.com.cn
總結(jié)
以上是生活随笔為你收集整理的使用动态代理实现用AOP对数据库进行操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9个GaussDB常用的对象语句
- 下一篇: 企业级分布式数据库 - GaussDB介