サーブレットのJDBCデータベース接続プール


国慶節の最後に、ノートなどを整理するのに時間がかかりました.
純servletのdemoで使用される.
JDBCデータベース接続プール:(コードテストは使えませんが、考え方は正しいはずですが、後で変更したコードは次のコードに戻っていません)
まず、継承が必要です.
DataSourceインタフェースのクラスです.これがアドレスプールです.
中身を書き直す
Connection 
getConnection()メソッド(パラメータなし)、これはアドレスを割り当てるためのもので、コードはこのように書くことができます.

    
    
    
    
public Connection getConnection() throws SQLException {
//
synchronized (pool) {
if(pool.size()>0){//
return pool.remove();//
}else if (pool.size()==0&&count<maxPoolSize) {
pool.add(createConnection());
return pool.remove();
}else {
// , , 。
try {
pool.wait();//
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
return pool.remove();
}
}
//return null;
}

ここのpoolは1つの容器で、中は接続池です!
次に、このクラスで接続データベースを作成する方法を示します.
Connection createConnection();
しかし、この中のアドレス(アドレスプールに置かれているのは代理接続です):

    
    
    
    
//
private Connection createConnection(){
Connection conn =null;
try {
Class.forName(driverClassName);
conn=DriverManager.getConnection(url, user, password);
// !!
// , close close
//
CloseMethodHandler handler = new CloseMethodHandler(pool);
Connection proxyconnConnection = handler.createProxy(conn);
count=count+1;
//return conn;
return proxyconnConnection;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

もちろん、ここではこのアドレスプールクラスの構築方法について書きますが、構築時に基本的なデータを取得し、アドレスプールに接続するいくつかの接続を作成するには

    
    
    
    
private LinkedList<Connection> pool=new LinkedList<Connection>();
private String driverClassName;
private String url;
private String user;
private String password;
private int count=0;//
public MyDataSource(int maxPoolSize,int initPoolSize,String driverClassName,String url,String user,String password){
this.initPoolSize=initPoolSize;
this.maxPoolSize=maxPoolSize;
this.driverClassName=driverClassName;
this.url=url;
this.user=user;
this.password=password;
//
for (int i = 0; i < initPoolSize; i++) {
Connection conn =createConnection();
pool.add(conn);
}
}

この構造方法については説明することはありません.
次:上の
CloseMethodHandlerというクラスです.このクラスはエージェントを作成するために使用されます.
すなわち、エージェントはcloseメソッドを呼び出すと、呼び出し回収とスレッドが起動するように、本来のデータベース接続である.
このクラスは継承しなければならない.
InvocationHandlerというインタフェースを書き換えて
invoke(Object proxy,Method method,Object[]args)メソッド;
この方法はエージェントオブジェクトを処理(ブロック)するために使用される.

    
    
    
    
public class CloseMethodHandler implements InvocationHandler {
private Connection target;
private LinkedList<Connection> pool;
// pool
public CloseMethodHandler(LinkedList<Connection> pool){
this.pool=pool;
}
//target , // ,  
/* , */
public Connection createProxy(Connection target){
System.out.println(target.getClass().getName());
this.target=target;
// , ( ), ( )
                    /* */
return (Connection) Proxy.newProxyInstance(target.getClass().getClassLoader(), new Class[]{Connection.class}, this);
}
// ==》 Connection close 。
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("close")){
//
synchronized (pool) {
pool.add((Connection) proxy);
pool.notify();//
}
}else{
    return method.invoke(target, args);// //
}// ,
return null; // close
}
}
, , , , ;;
:( )
- 。
Connection close , 。
Connection close 。
:C3P0,DBCP。
1、 javax.sql.DataSource 。
2、 getConnection()
3、 。( )
4、 。
5、 。( , , 。)。
6、 。
, :c3p0- commons-pool -dbcp   ; c3p0 , !!!! demo ,,,