真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

利用java如何實(shí)現(xiàn)一個DataSource功能

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

成都創(chuàng)新互聯(lián)專注于資溪企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)。資溪網(wǎng)站建設(shè)公司,為資溪等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

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

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

public class MyDataSource { 
  private LinkedList connectionPool = new LinkedList(); 
 
  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是經(jīng)過包裹后的對象,這里應(yīng)用到了代理模式。下面我們使用jdk的動態(tài)代理來改寫MyDataSource:

Java代碼

public class MyDataSource { 
  private LinkedList connectionPool = new LinkedList(); 
 
  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的動態(tài)代理生成的一個代理對象,該代理對象實(shí)現(xiàn)了Connection接口。

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

上述內(nèi)容就是利用java如何實(shí)現(xiàn)一個DataSource功能,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


文章題目:利用java如何實(shí)現(xiàn)一個DataSource功能
鏈接地址:http://weahome.cn/article/pehdod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部