数据源的问题?求各位高手帮忙!

maodie007 2008-02-25 10:28:50
我的是一个普通的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开始加载的时候初始化连接池啊?也就是初始化那个类?然后千千万万的用户都从同一个连接池中取得连接?
小弟真的是不懂,请各位高手指点一下。谢谢了~~
...全文
72 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
maodie007 2008-02-25
  • 打赏
  • 举报
回复
那段数据源类也是以前这里一个人给我提供的,所以还是不理解他的真正本意
maodie007 2008-02-25
  • 打赏
  • 举报
回复
我的数据源类是这么写的

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);


这样可行么?这样的话对于每一个用户都有自己的一个连接池。我在想的是创建无数多个连接池会出问题吗?连接池有关闭这个说法吗?
  • 打赏
  • 举报
回复
没有必要自己去实现连接池的,可以使用现成的连接池,比如:C3P0、DBCP什么的。

Web程序的话,也可以使用Tomcat的JNDI数据源,它是采用DBCP连接池的。
  • 打赏
  • 举报
回复
我都是这么做的:

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(); 就可以使用了。
  • 打赏
  • 举报
回复
不会的,你的连接池也是C3P0的,是采用单例模式实现的,所有的getInstance()都是返回
同样的东西。不存在多个连接池的问题。

不过我认为,不应让客户端直接去操纵连接池,连接池类中只留有一个getConnection的静态
方法供客户调用,以获得连接就可以了。没有必要把连接池拿给客户端的。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧