• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

【讨论】如何不让连接池耗尽?代码位置换一下,可能产生项目安全漏洞。**例如:页面多个link指向同一个方法,参数不一样,进行多个同时下

rickjelly2004 2006-11-10 01:16:52
一个APP服务器,一个DB服务器
页面中有多个文件下载连接,不过每个连接指向同一个方法,参数不一样,根据参数到数据库检索文件,BLOB型的,然后进行下载。

正常做法:
根据参数,打开连接,到数据库取数据,关闭连接,取到数据,然后可以WRITE出来。
如果文件很小,有可能一次就写完了。如果大数据,系统会再次读取,直到写完为止。

简单代码:
conn = A.getDBConnection() 取连接  
b=Getdata 得数据
conn.close() 关连接
response.setContentType 写数据
response.write
close

这种写法没什么问题,缺陷就是一次只能下载一个文件,也就是说点一个LINK,出现下载对话框,
保存,必须等这个文件保存好了,才能点另外的连接,不然点第二个连接,也出现下载对话框,
但是保存的话,第一个没下载好,就会把第一个保存的冲掉。

为了解决上面的可以进行多个下载,把上面的代码改了一下
try{
conn = A.getDBConnection() 取连接  
b=Getdata 得数据
response.setContentType 写数据
response.write
close
}finally{
conn.close() 关连接
}

这样就可以进行多个文件同时下载,甚至同一个link,不会冲掉前一个文件下载。
代价:文件没完成下载,有一个文件就会消耗一个数据库连接。
所以大文件下载不要按上面的方法写,按第一种方法写。

有人会说,小文件那就可以了,
注意最好不要这样,存在系统隐患,做法>>>>
当出现下载对话框时,点击保存,这个时候出现选择保存路径,不要点ok,放在这里,
重复这样的操作,点50下,出现50个保存选择,
此时就会消耗50个数据库连接,如此如此,有人恶意搞,会把数据库连接耗尽。
不安全。就算采取数据库连接超时就断方法,还是有点不妥。

针对上面的,谁有好办法解决多个文件同时下载,不被冲掉。

...全文
325 点赞 收藏 24
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
智能大石头 2007-02-26
呵呵,我可以跟你聊聊这个问题,可以给你一些建议。

QQ99363590
回复
rickjelly2004 2006-11-15
算了,没人气,吃过午饭结了,
回复
C5662601 2006-11-14
100个人同时下同一个数据库里的文本
和100个人同时下同一个数据库的100个不同文本
一样吗?
回复
rickjelly2004 2006-11-14
JAVA也可以
回复
rickjelly2004 2006-11-14
谁能提供一个多个文件同时下载来看看呢
一个服务器,DB取数据
回复
rickjelly2004 2006-11-13
希望如此吧
回复
所以必要自己随便发明 --> 所以没有必要自己随便发明
回复
要想避免“连接池耗尽”,就一个原则,尽快关闭连接(将物理连接放回连接池)。

而楼主认为第一种写法不能使得多个连接并行操作,这完全是自己使用“全局变量”来保存连接造成的。实际上,如果你需要100个连接,那么你就创建100个独立的连接对象,这100个连接它从连接池中也许分配20个物理连接就够了,你关闭越早使用的物理连接越少。

连接池本来就是让数据库编程傻瓜式地非常高效的写,不必特别担心,没有能力时不必自己创造出蹩脚的“高效共享数据连接”的设计。没有傻瓜照相机,也许今天人们的照相方法更加傻瓜,所以必要自己随便发明汽车轮子。
回复
using(SqlConnection conn=A.CreateAndOpenConnection()) //
{
b=Getdata(conn)
} //此时连接确保关闭
response.setContentType
response.write

这种写法,如果执行3次,谁能说一定是3个物理连接?完全可能只有一个。如果说open、close就是建立或者断开物理连接,那么是完全不知道连接池到底是什么所造成的。
回复
伴老思源 2006-11-13
肯定会建立多个连接
回复
“连接池耗尽”?如果你采用的数据库引擎具有连接池功能,那么你的两种程序也根本不使用连接池,这是你的问题所在。

很好地使用连接池,那么每一个连接使用完,尽早关闭,通常这样写(举例):

using(SqlConnection conn=A.CreateNewConnection())
{
b=Getdata(conn)
} //此时连接确保关闭
response.setContentType
response.write

从你的Getdata就可以看出你使用的连接是一个全局变量,那么连接池被你搞得毫无意义了。

使用连接池之后,任何连接都 new 一个新的连接实例,此实例内部会从连接池里分配连接;任何连接使用完都要尽快关闭,此关闭动作会把连接放回连接池,至于是否断开连接那是由连接池决定的,而有些人以为关闭连接就是断开物理连接,这是丝毫不理解连接池的,也会产生看上去画蛇添足的数据库连接程序。

如果采用的数据库引擎没有连接池,应该自己写一个简单的连接池对象,当然此连接对象未必要从DBConnection继承,但是连接的真实的创建和关闭应该由自定义的此连接对象来负责间接操作而不允许应用程序去直接操作。
回复
rickjelly2004 2006-11-13
还有阿
,如果不关闭连接下载,有个好处,就是可以判断客户端下载完毕,不过不保险,
回复
rickjelly2004 2006-11-13
LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^) ( ) 信誉

谢谢
取到就关闭,可以。

但是,如果想进行多个下载,那就不能关闭,呵呵
用户说,页面上这么多链接,我就想点,一个文件已经在下载中了,点另一个下载,就会
冲掉之前这个下载,呵呵
所以阿,人家就是想点一个就在下载,点另一个还要能下载,
回复
LoveCherry 2006-11-13
try{
conn = A.getDBConnection() 取连接  
b=Getdata 得数据

}finally{
conn.close() 关连接
}

response.setContentType 写数据
response.write
close
这样就没有什么问题了
你应该把数据读入内存后立刻conn.close而不是response.write后再close
后一种方法是把流都写到客户端了才会close
回复
rickjelly2004 2006-11-13
为什么没人回答呢?
奇怪呢
回复
rickjelly2004 2006-11-13
文件下载确实是连接的问题,因为是static,
所以采取2方法,2又产生了连接不关闭的问题,目前这种情况不能修改这个类阿,呵呵
我们主要做维护,所以我们只要改正了问题就OK了。
回复
股神 2006-11-10
回复
rickjelly2004 2006-11-10
高手们,说说你们的想法呢
回复
rickjelly2004 2006-11-10
因为字段的类型是blob,
回复
冷月孤峰 2006-11-10
帮顶……
回复
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2006-11-10 01:16
社区公告
暂无公告