我的是一个普通的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开始加载的时候初始化连接池啊?也就是初始化那个类?然后千千万万的用户都从同一个连接池中取得连接?
小弟真的是不懂,请各位高手指点一下。谢谢了~~
每个JSP页面开始的代码如下: DBPool db = null;
DBPool db_ = (DBPool) session.getAttribute("dbpool");
if (db_ == null) {
db = DBPool.getInstance();
} else {
db = db_;
}
session.setAttribute("dbpool", db);我一直认为这样有点不好,如果这样的话,那不是对于每个登陆的用户,都要创建一个连接池?这就违背了“连接池”的本意吧?
是不是要在web开始加载的时候初始化连接池啊?也就是初始化那个类?然后千千万万的用户都从同一个连接池中取得连接?
小弟真的是不懂,请各位高手指点一下。谢谢了~~
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(); 就可以使用了。
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);
这样可行么?这样的话对于每一个用户都有自己的一个连接池。我在想的是创建无数多个连接池会出问题吗?连接池有关闭这个说法吗?
同样的东西。不存在多个连接池的问题。不过我认为,不应让客户端直接去操纵连接池,连接池类中只留有一个getConnection的静态
方法供客户调用,以获得连接就可以了。没有必要把连接池拿给客户端的。