日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

使用动态代理实现用AOP对数据库进行操作

發布時間:2023/12/29 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用动态代理实现用AOP对数据库进行操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用動態代理實現用AOP對數據庫進行操作
2008-03-14 11:04 作者:reverocean 來源:賽迪網
[摘要] 要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)。 [關鍵字] 動態代理 AOP 數據庫
  要實現對數據庫的操作,離不開數據源(DataSource)或者連接(Connection),但是通常來說對數據庫的操作都應該放在DAO中,而DAO又不應該與應用服務器相關聯,所以一般都使用連接(Connection)。現在我們這里就有一個問題了,怎么在攔截器中獲得連接。我想可以通過兩種方式獲得:

  在分別討論這兩種方法之前,我們需要先討論一下在處理數據庫的時候的異常的處理。我這里做了一個TransactionException繼承至RuntimeException然后在攔截器里面拋出,再又應用框架處理這個異常。下面試這個類的代碼:

  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) 通過方法的第一個參數傳進去

  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就是需要進行事務處理的方法的開頭,這個方法可以寫成一個從配置文件里面去讀,這里我就寫死在里面了。只是對insert和update開頭的方法進行事務控制。

  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() {

  實現自己獲取連接的代碼

  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 下一頁>>
關鍵詞: 動態代理, AOP, 數據庫,

* 相關文章

1、使用“DB2”數據庫臨時表的6個注意事項
2、大型數據庫的設計原則與開發技巧
3、如何從數據庫查詢結果集中獲得隨機結果
4、關于Access數據庫4種安全方式
5、講解SQL Server 2005數據庫的同義詞Bug
6、如何防止插入刪除表造成的數據庫死鎖
7、詳細講解Oracle表分區相關概念及優點
8、詳細講解各種數據庫使用JDBC連接的方式
9、數據庫相關--Hibernate的事務和并發
10、Linux系統安全機制進階分析
11、安全的配置和應用MySQL數據庫

12、哪些因素可以影響Oracle數據庫的性能
13、SQL端口改變后的遠程連接和數據庫連接
14、Delphi編程:三層數據庫構架實例解析
15、對一些代碼加密后再放到Oracle數據庫中
16、SQL Server 2008關系數據庫引擎新增功能
17、J2EE綜合:業務邏輯和數據庫的訪問決策
18、J2EE綜合--業務邏輯和數據庫訪問決策
19、融會貫通Oracle數據庫的25條基本知識
20、exp的版本高于數據庫版本導出時出現報錯
21、使用“DB2”數據庫臨時表的6個注意事項

* 我要留言

論壇焦點

*
* PLSQL程序設計
*
* 經典資料3----oracle培訓18天老師
*
* 最新正式版 PL/SQL Developer v7.0
*
* Oracle函數大全
*
* 提供點ORACLE9i_優化設計與系統調整
*
* ORACLE初始化參數詳解
*
* SQL*PLUS命令的使用大全(已更新)
*
* 初學者的好書,圖文講解
*
* oracle超級幫助文件(中文版)-OR
*
* Oracle SQL 內置函數大全

技術分類

* 微軟技術
* vista Windows ISA Exchange SharePoint
* Oracle
* 入門與認證 數據庫管理 開發應用
* Sun
* StarSuite Solaris NetBeans SunJES
* IBM
* Ajax DB2 UNIX
* 數據庫
* SQL Server Sybase DB2 Access MySQL
* WEB開發
* ASP JSP PHP JavaScript VB VC
* JAVA開發
* J2SE J2EE J2ME Web Services XML
開源 SOA Eclipse Jbuilder
* NET開發
* C# J# ASP.NET VB.NET VC.NET C++
* 圖形設計
* Photoshop Coreldraw FreeHand Fireworks
Illustrator
* 多媒體技術
* Authorware MAYA 3Dmax Flash
* 虛擬技術
* vmware Virtual PC Virtuozzo xen
* 其他技術
* 中間件 嵌入式開發 移動開發 游戲開發

關于硅谷動力 | 廣告服務 | 版權聲明 | 加入硅谷動力 | 聯系我們 | 建議/投訴 | 網站導航 | 加入收藏

網站合作、內容監督、商務咨詢、投訴建議:010-65245588
合作建議:hezuo@mail.enet.com.cn

總結

以上是生活随笔為你收集整理的使用动态代理实现用AOP对数据库进行操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。