要實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作,離不開(kāi)數(shù)據(jù)源(DataSource)或者連接(Connection),但是通常來(lái)說(shuō)對(duì)數(shù)據(jù)庫(kù)的操作都應(yīng)該放在DAO中,而DAO又不應(yīng)該與應(yīng)用服務(wù)器相關(guān)聯(lián),所以一般都使用連接(Connection)?,F(xiàn)在我們這里就有一個(gè)問(wèn)題了,怎么在攔截器中獲得連接。我想可以通過(guò)兩種方式獲得:
          在分別討論這兩種方法之前,我們需要先討論一下在處理數(shù)據(jù)庫(kù)的時(shí)候的異常的處理。我這里做了一個(gè)TransactionException繼承至RuntimeException然后在攔截器里面拋出,再又應(yīng)用框架處理這個(gè)異常。下面試這個(gè)類的代碼:
          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)    通過(guò)方法的第一個(gè)參數(shù)傳進(jìn)去
          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就是需要進(jìn)行事務(wù)處理的方法的開(kāi)頭,這個(gè)方法可以寫(xiě)成一個(gè)從配置文件里面去讀,這里我就寫(xiě)死在里面了。只是對(duì)insert和update開(kāi)頭的方法進(jìn)行事務(wù)控制。
          2)    將Connection對(duì)象放在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() {
                  實(shí)現(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();
                  …………………………………………
          一系列操作
          …………………………………………
          }

              private Connection getConnection(){
                  return ConnectionUtil.getConnection();
              }
              
          }
          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 = getConnection();
                      try {
                          conn.setAutoCommit(false);
                      } catch (SQLException e) {
                          throw new TransactionException(e);
                      }
                  }
              }

              public void after(InvokeJniInfo invInfo) {
                  if(isNeedTransactions(invInfo)){
                      Connection conn = getConnection();
                      try {
                          conn.commit();
                      } catch (SQLException e) {
                          throw new TransactionException(e);
                      }finally{
                          if(conn != null){
                              try {
                                  conn.close();
                                  releaseConnection(conn);
                              } catch (SQLException e) {
                                  throw new TransactionException(e,"Close Connection is failure!");
                              }
                          }
                      }
                  }
              }

              public void exceptionThrow(InvokeJniInfo invInfo) {
                  if(isNeedTransactions(invInfo)){
                      Connection conn = getConnection();
                      try {
                          conn.rollback();
                      } catch (SQLException e) {
                          throw new TransactionException(e);
                      }finally{
                          if(conn != null){
                              try {
                                  conn.close();
                                  releaseConnection(conn);
                              } catch (SQLException e) {
                                  throw new TransactionException(e,"Close Connection is failure!");
                              }
                          }
                      }
                  }
              }
              
              private Connection getConnection(){
                  return ConnectionUtil.getConnection();
              }
              
              private void releaseConnection(Connection conn){
                  ConnectionUtil.releaseConnection(conn);
              }
              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;
              }
          }
              最后將這個(gè)攔截器添加到AOP攔截框架中去,InterceptorHandler類中的getIntercetors方法中添加一個(gè):

              private synchronized List getIntercetors(){
                  if(null == interceptors){
                      interceptors = new ArrayList();
                      ……………………………………
          interceptors.add(new TransactionInterceptor ());
                      ……………………………………
                  }
                  return interceptors;
          }
          posted on 2008-04-22 09:54 LifeNote 閱讀(1488) 評(píng)論(0)  編輯  收藏 所屬分類: Java 、Spring
           
          主站蜘蛛池模板: 理塘县| 青州市| 平顶山市| 东方市| 建德市| 南部县| 双桥区| 泸州市| 平远县| 仁寿县| 济南市| 宝清县| 乌苏市| 兴义市| 余江县| 大港区| 佛冈县| 永和县| 叙永县| 巩留县| 穆棱市| 广宁县| 唐海县| 洱源县| 苏州市| 江油市| 永仁县| 泸西县| 阿拉善左旗| 台东市| 大连市| 中超| 濉溪县| 新建县| 松溪县| 濮阳县| 正蓝旗| 翁牛特旗| 临邑县| 隆安县| 宁国市|