想做好一个网站,你不得不面对的问题。关于数据库连接。

45de 2007-03-15 06:41:06
想做一个中型门户网站,预计同时在线人数可达到1000人以上,采用下面哪种数据库连接方式最合理。

1、一个页面共用一个连接
描述:页面载入时打开数据库连接,而页面中不管有多少数据操作都用这个连接,最后用完后关闭连接。

2、每次会话用一个连接
描述:用户访问时打开数据库连接,并将连接存入Session,之后的所有属于该会话的数据库操作都应用这个Session存储的连接,在Session_End时关闭连接。

3、每一个操作一个连接
描述:这好像是目前用的最多的方法。即不管同一页面需要有多少个数据库操作,每操作一次打开一个新数据库连接,用完后,立即关闭;然后又打开,又关闭。有的复杂的页面可能就需要这样开开断断十来次,性能上总感觉有点问题。


我个人认为第1种方式比较好,大家觉得呢?欢迎指导。非常感谢。

或者大家还有更好的处理方式,也请不吝赐教,再次感谢。
...全文
507 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenzhaozhan 2007-03-20
  • 打赏
  • 举报
回复
数据库的连接还是得看具体的情况
confei 2007-03-19
  • 打赏
  • 举报
回复
支持 sp1234(想象力真的那么难吗?) 学习
stone3_hl 2007-03-19
  • 打赏
  • 举报
回复
mark
meteoroid1984 2007-03-19
  • 打赏
  • 举报
回复
支持 sp1234(想象力真的那么难吗?) 学习。
huyidao21 2007-03-17
  • 打赏
  • 举报
回复
学习了
belldandy11 2007-03-17
  • 打赏
  • 举报
回复
学习
lxwin01 2007-03-15
  • 打赏
  • 举报
回复
在.net中有池化功能,即使你用了new SqlConnection也只是此连接类的资源消耗。
打开和关闭都与连接池操作。
在连接字符串可以设置池中大小(可以容纳多少连接数)创建连接池只在第一次操作发生。
其实做系统都要找到一个平衡点,每次连接创建Connection影响你系统性能很小,因为每次和.net连接池打交道,并不直接创建数据库连接操作。

在大多数情况都会对数据库的操作进行封装,在DAO操作与自己封装的操作类打交道,有的还完成DAO的工作,这些对象每次创建会有系统开销比较大,因为不是一个类完成而是一组类,这时应该建立自己的对象池,或com,让容器帮助你完成对象池的工作。
例如:
IDataBase database=DataBaseFactory.GetDataBase();
IDataProvider provider=database.GetDataProvider();
provider.Insert(new User("admin","yourpassword","otherInfo"));

像database你完成可以做对象池来管理,还可以对IDataProvider有类似管理
简单一点如:
public class DataBaseManager:IDataBaseManager
{
public IDataBase GetDataBase()
{
lock(this){
IDataBase database=frees[0];//当然要检查一下
bounds.Add(database);
frees.RemoveAt(0);
return database;
}
}

public void Close(IDataBase database)
{
lock(this){
IDataBase temp=bounds[database];
frees.Add(temp);
bounds.Remove(database);
}
}
}

以上都是伪代码.
你也可以做其它的方法来实现。
45de 2007-03-15
  • 打赏
  • 举报
回复
TO:sp1234(想象力真的那么难吗?)

你使用c/s结构的Access数据库“系统”吗?没有。
答:可以b/s结构的Access数据库“网站”就有很多了,我这里主要说网站啊。


尽管你所说的就应该被理解为Access数据库,你的1和2也没有考虑避免异步操作的问题。
答:是的,如果是access数据库,对于我提出的三种方法都无法避免异步问题,但目前好像也没有谁能解决好Access的异步问题。但如果能找到一个相对比较稳定,性能也比较好的方法,那也是个不错的选择。


  • 打赏
  • 举报
回复
其实,即使对于Access的ADO.NET连接,也应该使用缓冲池。使用缓冲池,性能并不下降多少,但是你的程序不论同步、异步中都没有问题,这方面是线程安全的。我以前好像也从来没有见过使用Access数据库的人考虑过异步,没有人特意承认自己的程序线程不安全,大概根本不去想。
  • 打赏
  • 举报
回复
我从来不在正式开发中用Access数据库。Access的连接并不是SQL Server连接,你可以注意一下我从第一句说到连接都以SQL Server来说的。

你使用c/s结构的Access数据库“系统”吗?没有。Access运行在本地进程中,ADO.NET提供的Access连接所基于的Jet引擎是比ADO.Net提供的SQL Server引擎复杂不下几十倍,与SQL Server这种c/s数据库根本不是一类。

前提明确了是基于这个,那么我就可以不担心误解了。Access连接,如果是同步的(非异步的),那么你可以从来都不关闭。尽管如此,尽管你所说的就应该被理解为Access数据库,你的1和2也没有考虑避免异步操作的问题。
wanghu9999 2007-03-15
  • 打赏
  • 举报
回复
完全楼上
sp1234(想象力真的那么难吗?)
的想法.
我一直也用这个方法
45de 2007-03-15
  • 打赏
  • 举报
回复
连接数据库,需要时间不?

如寻找数据库服务器地址,再验证用户名和密码,然后连接成功。这些都不花时间吗?

如果这样连接一次是0.5秒,那么10次就是5秒,能这样计算不?
  • 打赏
  • 举报
回复
其实,所谓的性能问题大概就是判断一个字符串是否相等。

例如一个数据库连接字符串被编码为"asdfaf",然后以这个串作为key,将物理连接保存在连接池中。当分配新的连接时,查找连接池中又没有这个字符串。所谓性能消耗也就如此。这个匹配方法对于20年前的电脑也不能算是性能问题。
45de 2007-03-15
  • 打赏
  • 举报
回复
TO:sp1234(想象力真的那么难吗?)

对于:
SQL Server引擎的数据库连接不能共享。

那么:
用Access的数据库,数据库连接能共享吗?
  • 打赏
  • 举报
回复
你能明确说出你的 3. 的性能问题在哪里吗?

技术性地讨论系统设计时应该明确,才能分辨真伪。
lizhizhe2000 2007-03-15
  • 打赏
  • 举报
回复
需要的时候就如sp1234所言!
  • 打赏
  • 举报
回复
关键是“不能共享”数据库连接!在你考虑效率之前,先达到一个最起码的可靠运行的质量标准。
  • 打赏
  • 举报
回复
例如当同一连接有一个SqlDataReader打开的时候,对其查询运行ExecuteScalar肯定就出错了。SQL Server引擎的数据库连接不能共享。

你的1、2都没有小心地考虑“不能共享”的问题。
45de 2007-03-15
  • 打赏
  • 举报
回复
TO: sp1234(想象力真的那么难吗?)

ADO.net中不是已经有连接池了吗?还需要我们自己管理吗? 我想用不着吧。

在你的代码中,
using(SqlConnection conn=new SqlConnection(ConnString))
这些都是创建一个新的数据库连接吧,开一个关一个,再开再关,这样不断重复,性能估计还是有点问题吧?
  • 打赏
  • 举报
回复
你所说的那些,是基于完全不知道有连接池这回事的基础上才会提出的。如果你知道连接池,问题就不是这个角度了。
加载更多回复(2)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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