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;}} }
?