数据连接池原理演示

Posted on 2008-03-10 20:02 探佚 阅读(319) 评论(0)  编辑  收藏 所属分类: Java EE技术
多种原因使我很久没有写博客了,今天下午写了一个简单的ConnectionPool,
参考了<<深入浅出Hibernate>>。具体实现如下:
一、使用了连接池的DBManager
        思路:
        Connection 保存在Vector中,当前连接数小于最大连接数的时候,DBManger可以创
        建新的连接,当连接数达到最大连接数时,不允许再创建新的连接,这样就很
        好的限制了客户端的 连接量。 而客户端关闭连接时,首先判断当前连接数是
        否连接池允许的范围类,若是则将当连接前放回到连接池中,而非真正关闭连
        接,这样就实现了连接的重用,提高了访问效率。
public class DBManager {
    
// 连接池
    private static Vector<Connection> connPool;
    
// 最大连接数
    private static final int MAXCONNECTIONCOUNT = 2;

    
// 数据库连接属性
    public String driverClassName = "oracle.jdbc.driver.OracleDriver";
    
public String url = "jdbc:oracle:thin:@localhost:1521:oracle";
    
public String userName = "stephen";
    
public String password = "stephen";

    
public DBManager(){
        connPool 
= new Vector<Connection>();
    }

    
    
/**
     * 
     * 获取一个数据库连接
     * 
     * 
@return Connection
     * 
     
*/

    
public synchronized Connection getConnection() {
        Connection conn 
= null;
        
if (connPool.isEmpty() || connPool.size() < DBManager.MAXCONNECTIONCOUNT) {
            conn 
= this.createConnection();
        }
else{
            
int lastIndex = connPool.size() - 1;
            conn 
= connPool.get(lastIndex);
            connPool.remove(lastIndex);
        }

        
return conn;
    }

    
    
/**
     * 
     * 释放数据库连接
     *  
     
*/

    
public synchronized void releaseConnection(Connection conn){
        
if (connPool.size() == DBManager.MAXCONNECTIONCOUNT) {
            
try {
                conn.close();
            }
 catch (SQLException e) {
                e.printStackTrace();
            }

        }
else{
            connPool.add(conn);
        }

        
        System.out.println(
"连接池中连接数为: " + connPool.size());
    }

    
    
/**
     * 
     * 创建一个数据库连接
     * 
     * 
@return Connection
     * 
     
*/

    
private Connection createConnection() {
        Connection conn 
= null;
        
try {
            Class.forName(
this.driverClassName);
            conn 
= DriverManager.getConnection(url, userName, password);
            connPool.add(conn);
        }
 catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
 catch (SQLException e) {
            e.printStackTrace();
        }

        
return conn;
    }

}


二、测试连接池
         模拟三个客户端访问数据库,必须使客户端同时获取连接才能达到测试目的,
         因此在客户端的连接中使用了休眠当前线程,从而是连接不释放,达到同步
         效果。
         由于连接池允许的最大连接数我设置为2,因此我新建三个客户端同时访问。

客户端一:
public class Client1 {

    
public static void main(String[] args) {
        DBManager dbm 
= new DBManager();
        Connection conn 
= null;
        
try {
            conn 
= dbm.getConnection();
            Statement st 
= conn.createStatement();
            ResultSet rs 
= st.executeQuery("SELECT count(*) FROM \"jobs\"");
            
if (rs.next()) {
                System.out.println(
"客户端1连接数据库,需要15S.");
                Thread.currentThread().sleep(
15000);
                System.out.println(
"查询结束\n");
            }

        }
 catch (InterruptedException e) {
            e.printStackTrace();
        }
 catch (SQLException e) {
            e.printStackTrace();
        }
 finally {
            dbm.releaseConnection(conn);
        }

    }

}

客户端二:

public class Client2 {

    
public static void main(String[] args) {
        DBManager dbm 
= new DBManager();
        Connection conn 
= null;

        
// Client 2
        try {
            conn 
= dbm.getConnection();
            Statement st 
= conn.createStatement();
            ResultSet rs 
= st.executeQuery("SELECT * FROM \"jobs\"");
            
if (rs.next()) {
                System.out.println(
"客户端2连接数据库,需要10S.");
                Thread.currentThread().sleep(
10000);
                System.out.println(
"查询结束");
            }

        }
 catch (InterruptedException e) {
            e.printStackTrace();
        }
 catch (SQLException e) {
            e.printStackTrace();
        }
 finally {
            dbm.releaseConnection(conn);
        }

    }

}

客户端三:

public class Client3 {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        DBManager dbm 
= new DBManager();
        Connection conn 
= null;

        
// Client 3
        try {
            conn 
= dbm.getConnection();
            Statement st 
= conn.createStatement();
            ResultSet rs 
= st.executeQuery("SELECT * FROM \"jobs\"");
            
if (rs.next()) {
                System.out.println(
"客户端3连接数据库");
                System.out.println(
"查询结束");
            }

        }
 catch (SQLException e) {
            e.printStackTrace();
        }
 finally {
            dbm.releaseConnection(conn);
        }

    }

}

客户端一、二能够正常访问服务器。由于连接池最大连接数是2,所以客户端三访问服务器将出错!测试成功....呵

只有注册用户登录后才能发表评论。


网站导航:
 

Copyright © 探佚