javax.sql.DataSource.
Java.sql.*
DataSource
接口由驅(qū)動程序供應(yīng)商實現(xiàn)。共有三種類型的實現(xiàn):
標準的連接池,要求:
1:實現(xiàn)dataSource接口。
2:聲明一個集合類用于管理多個連接。
3:必須要擁有一種能力,回收連接。
4:必須要實現(xiàn)一個方法,getConnection以獲取一個連接。
5:實現(xiàn)DataSource接口的類,一般不能擁有static池對象。List.
6:在一個程序中,要求只擁有一個DataSource實例就可以了。
以下是具體的實現(xiàn):
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的子類時在構(gòu)造方法設(shè)置多個連接 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(); } ///其他的方法。不實現(xiàn)}
2:實現(xiàn)連接的回收
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的子類時在構(gòu)造方法設(shè)置多個連接 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; } }}
新聞熱點
疑難解答