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,同样的问题是否存在?

能否作简略的说明分析?
...全文
107 点赞 收藏 8
写回复
8 条回复
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
回复 点赞
liuhongxing1908901 2008年02月20日
如果没有连接池,你这样的设计应该是有问题的。webwork,struts并没有对数据库的并发操作做出特殊的安排,所以,问题同样存在。建议使用hibernate管理对象的持久化问题。
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告