最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 自己實(shí)現(xiàn)DataSource實(shí)現(xiàn)實(shí)例

 更新時(shí)間:2017年05月15日 15:40:52   投稿:lqh  
這篇文章主要介紹了java 自己實(shí)現(xiàn)DataSource實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下

java 自己實(shí)現(xiàn)DataSource實(shí)現(xiàn)代碼

  DataSource 對(duì)象所表示的物理數(shù)據(jù)源的連接。作為 DriverManager 工具的替代項(xiàng)。DataSource能提供最高性能的對(duì)數(shù)據(jù)庫(kù)的并發(fā)訪問(wèn),數(shù)據(jù)源技術(shù)是Java操作數(shù)據(jù)庫(kù)的一個(gè)很關(guān)鍵技術(shù),流行的持久化框架都離不開(kāi)數(shù)據(jù)源的應(yīng)用。

         數(shù)據(jù)源提供了一種簡(jiǎn)單獲取數(shù)據(jù)庫(kù)連接的方式,并能在內(nèi)部通過(guò)一個(gè)池的機(jī)制來(lái)復(fù)用數(shù)據(jù)庫(kù)連接,這樣就大大減少了創(chuàng)建數(shù)據(jù)庫(kù)連接的次數(shù),提高了系統(tǒng)性能。下面,我們自己動(dòng)手實(shí)現(xiàn)個(gè)精簡(jiǎn)的數(shù)據(jù)源,代碼如下:

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); 
  } 
  ... 
} 

        我們通過(guò)DataSource獲得的Connection是經(jīng)過(guò)包裹后的對(duì)象,這里應(yīng)用到了代理模式。下面我們使用jdk的動(dòng)態(tài)代理來(lái)改寫(xiě)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); 
  } 
} 

       通過(guò)這種方式獲得的Connection是通過(guò)jdk的動(dòng)態(tài)代理生成的一個(gè)代理對(duì)象,該代理對(duì)象實(shí)現(xiàn)了Connection接口。

       以上兩種方式實(shí)現(xiàn)了我們自己的DataSource,在我們通過(guò)DataSource獲得的Connection對(duì)象的close方法都已經(jīng)被改寫(xiě)過(guò)了。在Connection對(duì)象調(diào)用close方法時(shí),會(huì)將該Connection對(duì)象放入到緩存池中,而不是關(guān)閉對(duì)象。

       感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼

    SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼

    這篇文章主要為大家介紹了SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 詳解Java中對(duì)象池的介紹與使用

    詳解Java中對(duì)象池的介紹與使用

    對(duì)象池,顧名思義就是一定數(shù)量的已經(jīng)創(chuàng)建好的對(duì)象(Object)的集合。這篇文章主要為大家介紹了Java中對(duì)象池的介紹與使用,感興趣的可以了解一下
    2023-02-02
  • Java接口測(cè)試Cookie與token原理解析

    Java接口測(cè)試Cookie與token原理解析

    這篇文章主要介紹了Java接口測(cè)試Cookie與token原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫(kù)分表的示例代碼

    SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫(kù)分表的示例代碼

    本文主要介紹了SpringBoot+MybatisPlus實(shí)現(xiàn)sharding-jdbc分庫(kù)分表的示例代碼,以分庫(kù),分表,分庫(kù)分表三種方式來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java實(shí)現(xiàn)插入公式到PPT的示例代碼

    Java實(shí)現(xiàn)插入公式到PPT的示例代碼

    PPT中可插入公式,用于放映時(shí)演示相關(guān)內(nèi)容的論證、推算的依據(jù)。通過(guò)代碼,我們可借助特定的工具來(lái)實(shí)現(xiàn)在PPT中的插入公式,本文將對(duì)此作詳細(xì)介紹
    2022-07-07
  • java寫(xiě)入zip文件后無(wú)法進(jìn)行刪除的問(wèn)題及解決

    java寫(xiě)入zip文件后無(wú)法進(jìn)行刪除的問(wèn)題及解決

    這篇文章主要介紹了java寫(xiě)入zip文件后無(wú)法進(jìn)行刪除的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Idea2019創(chuàng)建Springboot Web項(xiàng)目的方法步驟

    Idea2019創(chuàng)建Springboot Web項(xiàng)目的方法步驟

    這篇文章主要介紹了Idea2019創(chuàng)建Springboot Web項(xiàng)目的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Nacos通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的方式分享

    Nacos通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的方式分享

    這篇文章主要給大家介紹了Nacos如何通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新,文中給了兩種實(shí)現(xiàn)方式供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • Java中的Vector詳細(xì)解讀

    Java中的Vector詳細(xì)解讀

    這篇文章主要介紹了Java中的Vector詳細(xì)解讀,Vector是實(shí)現(xiàn)了List接口的子類,其底層是一個(gè)對(duì)象數(shù)組,維護(hù)了一個(gè)elementData數(shù)組,是線程安全的,Vector類的方法帶有synchronized關(guān)鍵字,在開(kāi)發(fā)中考慮線程安全中使用Vector,需要的朋友可以參考下
    2023-09-09
  • SpringDataJPA原生sql查詢方式的封裝操作

    SpringDataJPA原生sql查詢方式的封裝操作

    這篇文章主要介紹了SpringDataJPA原生sql查詢方式的封裝操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

叶城县| 榕江县| 额尔古纳市| 民丰县| 湖口县| 阳山县| 柳林县| 军事| 三穗县| 开平市| 赣榆县| 庆阳市| 宽甸| 射洪县| 镇平县| 海原县| 黎川县| 华阴市| 丰宁| 扶绥县| 同江市| 苍溪县| 临西县| 山东省| 盐津县| 邮箱| 无棣县| 剑川县| 闽清县| 荆门市| 江口县| 甘孜| 西林县| 独山县| 通化县| 睢宁县| 韶山市| 丽水市| 于都县| 光泽县| 莱芜市|