DB连接管理问题

mostone 2008-02-20 09:34:44
在多个请求并发时,不知道下面的代码在数据库连接管理上会不会存在问题.

dbmanger file:
private static connection conn;
function getConnection(){
if conn exist return conn
else return new connection
}

function closeConnection(){
conn.commit();
conn.close();
}

servlet file:
function doget(){
conn = getConnection()
do something...
closeConnection()
}

会不会发生处理中途connection被其它请求关闭?
如果,将servlet改为webwork或struts的action,同样的问题是否存在?

能否作简略的说明分析?
...全文
150 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mostone 2008-02-22
其实,这个问题从本质上来说,是考验WEB容器是如何处理请求的.之前,我一直不确定,是不是多线程方式,现在可以确定了.

在并发多个HTTP请求时,WEB容器并不是按队列方式来依次处理,它不是同一时刻只处理一个请求,后续请求排队等待,而是每个请求过来后,为每个请求创建一个后台线程,因此这样就有线程同步的问题,资源共享及排它处理.

就如同这个DB连接问题,想想,如果不是多线程处理,那岂不是你只要买一个DB连接许可就足够了,也就不存在连接池的概念了.
另外一个可能是,多个请求会不会以多进程方式进行处理呢?在WIN中,查看系统进程,并没有发现启动了多个进程,再加上applebomb的回复,我确定结果是多线程方式.

知道了根本,设计解决之道时,就可以避免范同样的错误.
  • 打赏
  • 举报
回复
随风醉舞 2008-02-22
學習~
  • 打赏
  • 举报
回复
applebomb 2008-02-22
private static connection conn;
这个问题很严重,如果你不打算一个客户端用这个类的话连接泄漏是肯定了
就是“处理中途connection被其它请求关闭”
别期望等数据库连接或连接池自动超时来释放连接,客户可没那么耐性

分析:你只有一个static connection A,如果有两次请求发生如下顺序:
1.打开A
2.打开A
3.关闭A
4.关闭A

那么结果是:
成功打开A
成功打开A(把之前的那个connection的引用给覆盖掉,连拿出的柄都没有直接掉内存去了)
成功关闭A
A已关闭,出错
  • 打赏
  • 举报
回复
zb_86 2008-02-21
没啥大问题,用连接池要注意请求数,请求太大,Connection没有及时释放,连接池就会溢出
如果不用连接池,那么要注意同步问题和线程死锁,总之程序设计没有太大的问题。
  • 打赏
  • 举报
回复
nanjg 2008-02-21

void f(){
final Connection conn = ...;
try{
final Statement stmt = ...;
try{
final ResultSet rset = ...;
try{
...
}
finally{rset.close();}
}
finally{stmt.close();}
}
finally{conn.close();}
}
  • 打赏
  • 举报
回复
号天大教主 2008-02-21
顶了
  • 打赏
  • 举报
回复
nanjg 2008-02-21
try finally
  • 打赏
  • 举报
回复
如果没有连接池,你这样的设计应该是有问题的。webwork,struts并没有对数据库的并发操作做出特殊的安排,所以,问题同样存在。建议使用hibernate管理对象的持久化问题。
  • 打赏
  • 举报
回复
相关推荐
发帖
Web 开发
加入

8.0w+

社区成员

Java Web 开发
社区管理员
  • Web 开发社区
申请成为版主
帖子事件
创建了帖子
2008-02-20 09:34
社区公告
暂无公告