学习DatabaseConnectionPool--数据库连接池(随记二)


 一、从java类来分析连接池的构架,可以了解以下几点:

 1. 连接池实际上分2个部分:连接池类和连接池管理类。
 
 2. 连接池类作用是:创建和毁灭连接池、创建连接和关闭连接、遍历查询并提供有效连接、处理无效连接。
 
 3. 连接池管理类的作用是:初始化操作(提供创建一个连接池的操作方法、获取数据库的用户密码驱动信息提供给连接池类使用)、从连接池获取有效连接提供给用户、追踪连接操作和记录日志。
 
 4. 可以通过连接池管理类创建一个或者多个连接池。连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。
 
 5. 并发问题:为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。Java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:public synchronized Connection getConnection()


 二、分析连接池管理类:

 1. 首先是初始化方法:调用以下方法,实现读取属性文件、注册驱动、连接池创建。

         private   void  init()
        
{
            dbProps.load(getClass().getResourceAsStream(
"db.properties"));    //读取属性文件
            loadDrivers(dbProps);    //加载和注册所有JDBC驱动程序
            createPools(dbProps);    //根据指定属性创建连接池实例,props为连接池属性        
        }

 2. 获取数据库用户密码进行创建连接池操作。

         private   void  createPools (Properties props)
        
{
            DBConnectionPool pool 
= new DBConnectionPool (poolName,url,user,password,max);
            pools.put (poolName,pool) ;
        
            log (
"成功创建连接池" + poolName) ;
        }

 3. 注册驱动

         private   void  loadDrivers ( Properties props )
        
{    
            String driverClasses 
= props.getProperty("drivers");
            Driver driver 
= (Driver)Class.forName(driverClasses).newInstance();            
            DriverManager.registerDriver(driver);
            
            drivers.addElement(driver);
            log(
"成功注册JDBC驱动程序" + driverClasses );
        }

 4. 获取空闲连接

         public  Connection getConnection (String name)
        
{
            DBConnectionPool pool 
= (DBConnectionPool) pools.get(name);
            
if ( pool != null )    
            
{
                
return pool.getConnection();
            }
    
            
else
            
{
                
return null ;
            }
        
        }

 5. 关闭连接,撤销所有驱动的注册

         public   synchronized   void  release()
        
{
            Enumeration allpools 
= pools.elements(); 
            
while (allpools.hasMoreElements()) 
            
{
                DBConnectionPool pool 
= (DBConnectionPool) allpools.nextElement();
                pool.release();
            }
    
        }

 三、分析连接池类:

 1. 获取管理类传递的数据库库参数值

         public  DBConnectionPool ( String name, String URL, String user,String password, int  maxConn )
        
{
            
this.name = name ;
            
this.URL = URL ;
            
this.user = user ;
            
this.password = password ;
            
this.maxConn = maxConn ;
        }

        

 2. 释放有效连接 

         public   synchronized  Connection getConnection()
        
{
            
//从连接池获得一个可用连接,如果没有空闲且连接数在最大连接范围内,则创建新连接
            
//如果原来登记的连接无效,则从向量中删除
            
//然后递归调用自己以尝试新的可用连接        
            con = (Connection) freeConnections.firstElement() ;
            freeConnections.removeElementAt(
0);    
            
try
            
{
                
if ( con.isClosed() )
                
{
                    log(
"从连接池" + name + "删除一个无效连接");                            
                    con 
= getConnection();//递归调用自己,尝试获得可用连接
                }
    
            }

            
catch (SQLException e )
            
{
                    log(
"从连接池" + name + "删除一个无效连接");                            
                    con 
= getConnection();    //递归调用自己,尝试获得可用连接                
            }
                
        }

3. 关闭所有连接

         public   synchronized   void  release()
        
{
            Enumeration allConnections 
= freeConnections.elements(); 
            
while (allConnections.hasMoreElements()) 
            
{
                Connection con 
= (Connection) allConnections.nextElement();
                
try
                
{
                    con.close() ;
                    log (
"关闭连接池" + name + "中的一个连接") ;    
                }

                
catch (SQLException e )
                
{
                    log (
"无法关闭连接池" + name + "中的一个连接") ;    
                }

            }

            freeConnections.removeAllElements();    
        }

 4. 创建新连接

         private  Connection newConnection()
        
{
            
if ( user == null )
            
{
                con 
= DriverManager.getConnection(URL);    
            }

            
else
            
{
                con 
= DriverManager.getConnection( URL,user,password );    
            }

            log( 
"连接池" + name + "创建一个新的连接" ) ;            
        }

 这是连接池的简单的基本构架,实用性很一般,扩展性和操作性比较差,仅供学习理解所用,需要进行更好的完善
 

你可能感兴趣的:(数据库,jdbc,数据库连接池,user,url,wrapper)