日期:2014-05-16  浏览次数:20355 次

C3P0数据源使用
package   C3P0; 
import   java.sql.Connection; 
import   java.sql.SQLException; 
import   java.beans.PropertyVetoException; 
import   com.mchange.v2.c3p0.ComboPooledDataSource; 
public   class   DBPool{       
    private   static   DBPool   dbPool;       
    private   ComboPooledDataSource   dataSource;     

    static   {       
            dbPool=new   DBPool();       
    }       
    
    public   DBPool(){       
            try   {       
                    dataSource=new   ComboPooledDataSource();       
                    dataSource.setUser( "id ");       
                    dataSource.setPassword( "pw ");       
                    dataSource.setJdbcUrl( "jdbc:mysql://127.0.0.1:3306/test? 

autoReconnect=true&useUnicode=true&characterEncoding=GB2312 "); 
                    dataSource.setDriverClass( "com.mysql.jdbc.Driver "); 
                    dataSource.setInitialPoolSize(2); 
                    dataSource.setMinPoolSize(1); 
                    dataSource.setMaxPoolSize(10); 
                    dataSource.setMaxStatements(50); 
                    dataSource.setMaxIdleTime(60);       
            }   catch   (PropertyVetoException   e)   {       
                throw   new   RuntimeException(e);       
            }       
    }       

    public   final   static   DBPool   getInstance(){       
            return   dbPool;       
    }       

    public   final   Connection   getConnection()   {       
            try   {       
                    return   dataSource.getConnection();       
            }   catch   (SQLException   e)   {       
                    throw   new   RuntimeException( "无法从数据源获取连接 ",e);       
            }       
    }     
    
    public   static   void   main(String[]   args)   throws   SQLException   { 
Connection   con   =   null; 
try   { 
con   =   DBPool.getInstance().getConnection(); 
}   catch   (Exception   e){ 
}   finally   { 
if   (con   !=   null) 
con.close(); 
} 
} 
}

?

引用 8 楼 xyflash 的回复:
每用一次都要
Connection conn = DBPool.getInstance.getConnection();
一次。。感觉没起到连接池的作用啊



楼主,使用连接池的时候并不是在代码中不用获取/释放数据库连接,而是在代码中向连接池申请/释放连接,对于代码而言,可以把连接池看成数据库。

换句话说,连接池就是数据库的代理,之所以要使用这个代理是因为直接向数据库申请/释放连接是要降低性能的:如果每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,那么频繁发生这种数据库操作时,系统的性能必然会急剧下降。

连接池的作用是自己维护数据库连接,数据库连接池的主要操作如下:
  (1)建立数据库连接池对象(服务器启动)。
  (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  (4)存取数据库。
  (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

?

?

?

?

?

?

?

我刚刚写了一个很简单的C3P0使用示例,分别测试了使用连接池和不使用连接池时的性能差异。

package com.lnbdqn;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public final class ConnectionManager {

    private static ConnectionManager instance;
    private static ComboPooledDataSource dataSource;

    private ConnectionManager() throws SQLException, PropertyVetoException {
        dataSource = new ComboPooledDataSource();

        dataSource.setUser("loux");
        dataSource.setPassword("loux");
        dataSource.setJdbcUrl("jdbc:oracle:thin:@192.168.100.70:1521:orcl");
        dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");
        dataSource.setInitialPoolSize(5);
        dataSource.setMinPoolSize(1);
        dataSource.setMaxPoolSize(10);
        dataSource.setMaxStatements(50);
        dataSource.setMaxIdleTime(60);
    }

    public static final ConnectionManager getInstance() {
        if (instance == null) {
            try {
                instance = new ConnectionManager();
            } catch (Exception e) {
                e.pr