java 自己實(shí)現(xiàn)DataSource實(shí)現(xiàn)實(shí)例
java 自己實(shí)現(xiàn)DataSource實(shí)現(xiàn)代碼
DataSource 對(duì)象所表示的物理數(shù)據(jù)源的連接。作為 DriverManager 工具的替代項(xiàng)。DataSource能提供最高性能的對(duì)數(shù)據(jù)庫的并發(fā)訪問,數(shù)據(jù)源技術(shù)是Java操作數(shù)據(jù)庫的一個(gè)很關(guān)鍵技術(shù),流行的持久化框架都離不開數(shù)據(jù)源的應(yīng)用。
數(shù)據(jù)源提供了一種簡(jiǎn)單獲取數(shù)據(jù)庫連接的方式,并能在內(nèi)部通過一個(gè)池的機(jī)制來復(fù)用數(shù)據(jù)庫連接,這樣就大大減少了創(chuàng)建數(shù)據(jù)庫連接的次數(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); } ... }
我們通過DataSource獲得的Connection是經(jīng)過包裹后的對(duì)象,這里應(yīng)用到了代理模式。下面我們使用jdk的動(dòng)態(tài)代理來改寫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的動(dòng)態(tài)代理生成的一個(gè)代理對(duì)象,該代理對(duì)象實(shí)現(xiàn)了Connection接口。
以上兩種方式實(shí)現(xiàn)了我們自己的DataSource,在我們通過DataSource獲得的Connection對(duì)象的close方法都已經(jīng)被改寫過了。在Connection對(duì)象調(diào)用close方法時(shí),會(huì)將該Connection對(duì)象放入到緩存池中,而不是關(guān)閉對(duì)象。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Springboot mybatis plus druid多數(shù)據(jù)源解決方案 dynamic-datasource的使用詳解
- Spring Boot 自定義數(shù)據(jù)源DruidDataSource代碼
- 詳解spring cloud config實(shí)現(xiàn)datasource的熱部署
- 淺談利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題
- 詳解利用Spring的AbstractRoutingDataSource解決多數(shù)據(jù)源的問題
- Spring(AbstractRoutingDataSource)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換示例
- 使用Spring的AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源切換示例
- 如何在MyBatis中實(shí)現(xiàn)DataSource
相關(guān)文章
Spring Boot 如何將 Word 轉(zhuǎn)換為 PDF
這篇文章主要介紹了Spring Boot將Word轉(zhuǎn)換為 PDF,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08Spring Cloud 中@FeignClient注解中的contextId屬性詳解
這篇文章主要介紹了Spring Cloud 中@FeignClient注解中的contextId屬性詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringMVC編程使用Controller接口實(shí)現(xiàn)控制器實(shí)例代碼
這篇文章主要介紹了SpringMVC編程使用Controller接口實(shí)現(xiàn)控制器實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以參考下。2017-11-11Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程詳細(xì)講解
這篇文章主要介紹了Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程,事務(wù)管理對(duì)于企業(yè)應(yīng)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性,感興趣想要詳細(xì)了解可以參考下文2023-05-05