高手帮我来看一看

littlef 2003-08-24 08:14:39
有这样一个PROJECT,设计思路如下:
首先定义一个超类DataAccess
public class DataAccess()
{
protected Connection connection=null;
Pool pool = new Pool();//Pool类实现一个连接池,用线程产生Connection

public DataAccess()
{
connection = pool.getConnection();
}
public ResultSet select(String sql)
{
Statement statement = connection.createStatement();
.........
connection.close();
}
public void update(String sql)
{
Statement statement = connection.createStatement();
.............
connection.close();
}
.
.
.
}

接着定义了许多类继承DataAccess如:
public class User extends DataAccess
{
......
ResultSet rs = select(sql);
......

int i = update(sql);
......
}
类似User的类还有很多,基本上都是这些方法

然后就写一些JSP页面来调用User类中的方法,进行数据操作,问题出现在运行的过程中:当到了某个JSP 页面的时候,会发现连接池中的空闲连接没有了,而且被占用的连接也没有被释放,(设计时想每一个线程用一个连接,可是不知道怎么变成了每一个select()方法或update()方法占用了一个连接,并且没有及时释放,因此连接不够用),大家能不能帮小弟想一想办法,来解决这个问题,或者检查以上思路会不会有错误

谢谢!!!
...全文
67 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
LingFengNB 2003-08-24
  • 打赏
  • 举报
回复
请注意。上面两个文件在一个包中。
LingFengNB 2003-08-24
  • 打赏
  • 举报
回复
看看以下我自己写的代码,你就明白怎么写了,我曾经用过的,(可以直接用)但建议不要拷贝,自己可以试着写,下面给你参考。

//用于创建连接池;
import java.sql.*;
import java.util.*;

public class ConnBean {
private int inUse=0;
private Vector connections=new Vector();
private String poolname;
private String dbid;
private String drivername;
private String username;
private String passwd;
private int maxconn;
public ConnBean(String poolname,String dbid,String drivername,
String username,String passwd,int maxconn) {
this.poolname=poolname;
this.dbid=dbid;
this.drivername=drivername;
this.username=username;
this.passwd=passwd;
this.maxconn=maxconn;
}
public synchronized void releaseConn(Connection conn){
connections.addElement(conn);
inUse--;
}
public synchronized Connection getConn(){
Connection con=null;
if(connections.size()>0){
con=(Connection)connections.elementAt(0);
connections.removeElementAt(0);
try {
if (con.isClosed())
con = getConn();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
else if(maxconn==0||inUse<maxconn){
con=newConn();
}
if(con!=null){
inUse++;
}
return con;
}
private Connection newConn(){
Connection con=null;
try{
Class.forName(drivername).newInstance();
con=DriverManager.getConnection(dbid,username,passwd);
}
catch(Exception e){
e.printStackTrace();
return null;
}
return con;
}
public synchronized void closeconn(){
Enumeration allConnections=connections.elements();
while(allConnections.hasMoreElements()){
Connection con=(Connection) allConnections.nextElement();
try{
con.close();
}
catch(SQLException e){
e.printStackTrace();
}
}
connections.removeAllElements();
}
}

//管理连接池

import java.sql.*;
import java.util.*;

public class ConnManager {
private Vector poolnames=new Vector();
private Vector drivernames=new Vector();
private Vector dbids=new Vector();
private Vector usernames=new Vector();
private Vector passwds=new Vector();
private Vector maxcons=new Vector();
private Hashtable connPools=new Hashtable();
public ConnManager() {
//在这里创建不同类型数据库的连接池,只需在这里重写下面的代码,比如SQLSERVER,ORACLE, ACCESS,MYSQL
poolnames.addElement("连接池名");
drivernames.addElement("JDBC驱动");
dbids.addElement("url");
usernames.addElement("用户名");
passwds.addElement("密码");
maxcons.addElement("最大连接数");
createPools();
}
public void realeaseConn(String name,Connection con){
ConnBean pool=(ConnBean)connPools.get(name);
if(pool!=null)
pool.releaseConn(con);
}
public Connection getConn(String name){
ConnBean pool=(ConnBean)connPools.get(name);
if(pool!=null)
return pool.getConn();
return null;
}
public synchronized void closeConn(){
Enumeration allPools=connPools.elements();
while(allPools.hasMoreElements()){
ConnBean pool=(ConnBean)allPools.nextElement();
pool.closeconn();
}
}
private void createPools(){
for(int i=0;i<poolnames.size();i++){
String poolname=poolnames.elementAt(i).toString();
String drivername=drivernames.elementAt(i).toString();
String dbid=dbids.elementAt(i).toString();
String username=usernames.elementAt(i).toString();
String passwd=passwds.elementAt(i).toString();
int maxconn=0;
try{
maxconn=Integer.parseInt(maxcons.elementAt(i).toString());
}
catch(NumberFormatException e){
e.printStackTrace();
}
ConnBean pool=new ConnBean(poolname,dbid,drivername,username,passwd,maxconn);
connPools.put(poolname,pool);
}
}
}

81,090

社区成员

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

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