java学习笔记—标准连接池的实现(27)

王朝学院·作者佚名  2016-05-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

java学习笔记—标准连接池的实现(27)javax.sql.DataSource.

Java.sql.*

DataSource 接口由驱动程序供应商实现。共有三种类型的实现:

基本实现 - 生成标准的 Connection 对象 – 一个DataSource数据源中,只有一个Connection ,这个不是池管理。连接池实现 [W1]- 生成自动参与连接池的 Connection 对象。分布式事务实现 - 生成一个 Connection 对象,该对象可用于分布式事务,大多数情况下总是参与连接池。JTA.jar – SUN。

标准的连接池,要求:

1:实现dataSource接口。

2:声明一个集合类用于管理多个连接。

3:必须要拥有一种能力,回收连接。

4:必须要实现一个方法,getConnection以获取一个连接。

5:实现DataSource接口的类,一般不能拥有static池对象。List.

6:在一个程序中,要求只拥有一个DataSource实例就可以了。

以下是具体的实现:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.LinkedList;import javax.sql.DataSource;/** * 标准的连接 */public class DBPool implements DataSource { //声明一个池管理对象 PRivate LinkedList<Connection> pool = new LinkedList<Connection>(); //在初始化这个DataSourc的子类时在构造方法设置多个连接 public DBPool(){ try{ Class.forName("com.MySQL.jdbc.Driver"); String url = "jdbc:mysql:///db909?characterEncoding=UTf8"; for(int i=0;i<3;i++){ Connection con = DriverManager.getConnection(url,"root","1234"); //将生成的这个连接。放到pool pool.add(con); } }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } public Connection getConnection() throws SQLException { return pool.removeFirst(); } ///其他的方法。不实现}

2:实现连接的回收

package cn.itcast.utils;import java.io.PrintWriter;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.LinkedList;import javax.sql.DataSource;/** * 标准的连接 */public class DBPool implements DataSource { //声明一个池管理对象 private LinkedList<Connection> pool = new LinkedList<Connection>(); //在初始化这个DataSourc的子类时在构造方法设置多个连接 public DBPool(){ try{ Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql:///db909?characterEncoding=UTf8"; for(int i=0;i<3;i++){ final Connection con = DriverManager.getConnection(url,"root","1234"); Object proxyedConn = Proxy.newProxyInstance(DBPool.class.getClassLoader(), new Class[]{Connection.class}, new InvocationHandler() { public Object invoke(Object proxyedConnection, Method method, Object[] args) throws Throwable { if(method.getName().equals("close")){ synchronized (pool) { pool.addLast((Connection) proxyedConnection); pool.notify(); } return null; } //目标方法的返回值 Object returnValue=method.invoke(con, args); return returnValue; } }); pool.add((Connection) proxyedConn); } }catch(Exception e){ throw new RuntimeException(e.getMessage(),e); } } public Connection getConnection() throws SQLException { synchronized (pool) { if(pool.size()==0){ try { pool.wait(); } catch (InterruptedException e) { e.printStackTrace(); } return getConnection(); } Connection con = pool.removeFirst(); System.err.println("siize:"+pool.size()); return con; } }}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航