亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用java如何實現一個DataSource功能

發布時間:2020-11-19 16:13:14 來源:億速云 閱讀:839 作者:Leah 欄目:編程語言

本篇文章為大家展示了利用java如何實現一個DataSource功能,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

  DataSource 對象所表示的物理數據源的連接。作為 DriverManager 工具的替代項。DataSource能提供最高性能的對數據庫的并發訪問,數據源技術是Java操作數據庫的一個很關鍵技術,流行的持久化框架都離不開數據源的應用。

         數據源提供了一種簡單獲取數據庫連接的方式,并能在內部通過一個池的機制來復用數據庫連接,這樣就大大減少了創建數據庫連接的次數,提高了系統性能。下面,我們自己動手實現個精簡的數據源,代碼如下:

public class MyDataSource { 
  private LinkedList<Connection> connectionPool = new LinkedList<Connection>(); 
 
  public MyDataSource() { 
    for (int i = 0; i < 10; i++) { 
      connectionPool.add(new MyConnection(creatConnection(),this)); 
    } 
  } 
  private Connection creatConnection() { 
    try { 
      return DriverManager.getConnection( 
          "jdbc:mysql://localhost:3306/test", "root", "root"); 
    } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      throw new ExceptionInInitializerError(); 
    } 
  } 
   
  public Connection getConnection(){ 
    System.out.println(connectionPool.size()); 
    return connectionPool.removeFirst(); 
  } 
   
  public void freeConnection(Connection conn){ 
    System.out.println("DataSource Close Connection"); 
    connectionPool.addLast(conn); 
  } 
} 
 

Java代碼 

public class MyConnection implements Connection{ 
  private Connection connection; 
  private MyDataSource datasource; 
  public Connection getConnection() { 
    return connection; 
  } 
 
  public void setConnection(Connection connection) { 
    this.connection = connection; 
  } 
 
  public MyConnection(Connection realconnection,MyDataSource datasource){ 
    this.connection=realconnection; 
    this.datasource=datasource; 
  } 
   
  @Override 
  public void close() throws SQLException { 
    // TODO Auto-generated method stub 
    System.out.println("MyConnection Close"); 
    datasource.freeConnection(this); 
  } 
  ... 
} 

        我們通過DataSource獲得的Connection是經過包裹后的對象,這里應用到了代理模式。下面我們使用jdk的動態代理來改寫MyDataSource:

Java代碼

public class MyDataSource { 
  private LinkedList<Connection> connectionPool = new LinkedList<Connection>(); 
 
  public MyDataSource() { 
    for (int i = 0; i < 10; i++) { 
      connectionPool.add(GetProxy(creatConnection())); 
    } 
  } 
 
  private Connection GetProxy(final Connection connection) { 
    // TODO Auto-generated method stub 
    return (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, new InvocationHandler(){ 
      @Override 
      public Object invoke(Object proxy, Method method, Object[] args) 
          throws Throwable { 
        // TODO Auto-generated method stub 
        Object value; 
        if(method.getName().equalsIgnoreCase("close")){ 
          connectionPool.addLast((Connection)proxy); 
          System.out.println(connectionPool.size()); 
          return null; 
        }else{ 
          value=method.invoke(connection, args); 
        } 
        System.out.println(connectionPool.size()); 
        return value; 
      } 
       
    }); 
     
  } 
 
  private Connection creatConnection() { 
    try { 
      return DriverManager.getConnection( 
          "jdbc:mysql://localhost:3306/test", "root", "root"); 
    } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      throw new ExceptionInInitializerError(); 
    } 
  } 
   
  public Connection getConnection(){ 
    System.out.println(connectionPool.size()); 
    return connectionPool.removeFirst(); 
  } 
   
  public void freeConnection(Connection conn){ 
    System.out.println("DataSource Close Connection"); 
    connectionPool.addLast(conn); 
  } 
} 

       通過這種方式獲得的Connection是通過jdk的動態代理生成的一個代理對象,該代理對象實現了Connection接口。

       以上兩種方式實現了我們自己的DataSource,在我們通過DataSource獲得的Connection對象的close方法都已經被改寫過了。在Connection對象調用close方法時,會將該Connection對象放入到緩存池中,而不是關閉對象。

上述內容就是利用java如何實現一個DataSource功能,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铁岭县| 闽侯县| 霍林郭勒市| 西宁市| 呼和浩特市| 府谷县| 正镶白旗| 大关县| 延寿县| 崇信县| 杨浦区| 孟村| 民勤县| 遵化市| 通化市| 咸丰县| 汕头市| 涞源县| 繁峙县| 台安县| 棋牌| 富宁县| 衡阳市| 黄山市| 丹东市| 博爱县| 高碑店市| 北辰区| 肇庆市| 苏州市| 甘德县| 明溪县| 兰西县| 日照市| 缙云县| 米泉市| 诸暨市| 武功县| 和顺县| 象州县| 肃宁县|