我的是一个普通的web项目,没有用任何框架,由于要对数据库的操作,我用一个类写了一个数据源连接池,我现在是这样取得连接池和连接的,对于对于每个页面我都会创建一个连接池,然后获得连接,同时对于每一个页面,也会把连接池对象保存在session里,同时也会对每个页面的最开始加载判断session里是否有连接池对象,如果有就不创建。
每个JSP页面开始的代码如下: DBPool db = null;
DBPool db_ = (DBPool) session.getAttribute("dbpool");
if (db_ == null) {
db = DBPool.getInstance();
} else {
db = db_;
}
session.setAttribute("dbpool", db);我一直认为这样有点不好,如果这样的话,那不是对于每个登陆的用户,都要创建一个连接池?这就违背了“连接池”的本意吧?
是不是要在web开始加载的时候初始化连接池啊?也就是初始化那个类?然后千千万万的用户都从同一个连接池中取得连接?
小弟真的是不懂,请各位高手指点一下。谢谢了~~

解决方案 »

  1.   

    我都是这么做的:import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;import com.bao.config.Config;
    import com.mchange.v2.c3p0.ComboPooledDataSource;import java.beans.PropertyVetoException;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;import com.bao.config.Config;
    import com.mchange.v2.c3p0.ComboPooledDataSource;/**
     * C3P0连接池
     */
    public class ConnectionFactory {    private ConnectionFactory(){
        }        private static ComboPooledDataSource ds = null;    static {
            try {
                Logger log = Logger.getLogger("com.mchange");
                log.setLevel(Level.WARNING);
                ds = new ComboPooledDataSource();
                // 设置JDBC的Driver类
                  ds.setDriverClass(Config.getDriverClass());
                // 设置JDBC的URL
                ds.setJdbcUrl(Config.getJdbcUrl());
                // 设置数据库的登录用户名
                  ds.setUser(Config.getDatabaseUsername());
                // 设置数据库的登录用户密码
                  ds.setPassword(Config.getDatabasePassword());
                // 设置连接池的最大连接数
                  ds.setMaxPoolSize(Config.getMaxPoolSize());
                // 设置连接池的最小连接数
                  ds.setMinPoolSize(Config.getMinPoolSize());
                // 设置连接的失效时间
                  ds.maxIdleTime(Config.getMaxIdleTime());
            } catch (PropertyVetoException e) {
                e.printStackTrace();
            }
        }
      
        public static synchronized Connection getConnection() {
            Connection con = null;
            try {
                con = ds.getConnection();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            return con;
        }
        // C3P0 end
    }在使用时用,Connection con = ConnectionFactory.getConnection(); 就可以使用了。
      

  2.   

    没有必要自己去实现连接池的,可以使用现成的连接池,比如:C3P0、DBCP什么的。Web程序的话,也可以使用Tomcat的JNDI数据源,它是采用DBCP连接池的。
      

  3.   

    我的数据源类是这么写的import com.mchange.v2.c3p0.ComboPooledDataSource;import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.beans.PropertyVetoException;/**
     * DBPool.java User: wanghy Date: 2008-1-9
     */
    public class DBPool {

    static String DriverClass="oracle.jdbc.driver.OracleDriver";
    static String JdbcUrl="jdbc:oracle:thin:@192.168.***.***:1521:ora9i";
    static String DatabaseUsername="bookweb";
    static String DatabasePassword="bookweb";
    static int MaxPoolSize=40;
    static int MinPoolSize=5;
    static int MaxStatement=140;

    private static DBPool dbPool=null; private ComboPooledDataSource dataSource; static {
    if(dbPool==null)
    dbPool = new DBPool();
    } private DBPool() {
    try {
    dataSource = new ComboPooledDataSource();
    dataSource.setUser("bookweb");
    dataSource.setPassword("bookweb");
    dataSource.setJdbcUrl(JdbcUrl);
    dataSource.setDriverClass(DriverClass);
    dataSource.setInitialPoolSize(5);
    dataSource.setMinPoolSize(1);
    dataSource.setMaxPoolSize(50000);
    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);
    }
    }
    然后在每个JSP页面写这么一段代码    DBPool db = null;
        DBPool db_ = (DBPool) session.getAttribute("dbpool");
        if (db_ == null) {
            db = DBPool.getInstance();
        } else {
            db = db_;
        }
        session.setAttribute("dbpool", db);
    这样可行么?这样的话对于每一个用户都有自己的一个连接池。我在想的是创建无数多个连接池会出问题吗?连接池有关闭这个说法吗?
      

  4.   

    不会的,你的连接池也是C3P0的,是采用单例模式实现的,所有的getInstance()都是返回
    同样的东西。不存在多个连接池的问题。不过我认为,不应让客户端直接去操纵连接池,连接池类中只留有一个getConnection的静态
    方法供客户调用,以获得连接就可以了。没有必要把连接池拿给客户端的。