日期:2014-05-19  浏览次数:20351 次

想做好一个网站,你不得不面对的问题。关于数据库连接。
想做一个中型门户网站,预计同时在线人数可达到1000人以上,采用下面哪种数据库连接方式最合理。

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

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

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


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

或者大家还有更好的处理方式,也请不吝赐教,再次感谢。

------解决方案--------------------
我是用第三种!!做些小项目
性能也没什么不同!
------解决方案--------------------
如果你说的就是物理连接,那么你说的统统是错误的。一个处理过程中,要经过成千上万条逻辑代码,有许多许多分开、独立设计的子过程。如果必须把这些过程都拿出来为你一时之需而设计结构和流程,这太原始了。

可能我在评价多个你就更难以明白我的意思了。那么就说实际的:

数据库连接依赖于数据库连接池。在每一个需要连接的地方,从连接池中打开一个连接,尽快用完尽快释放连接。

例如对于SQL Server连接,可以写:

void Process_1()
{
using(SqlConnection conn=new SqlConnection(ConnString))
{
.....//使用这个连接conn
}
}

void Process_2()
{
using(SqlConnection conn=new SqlConnection(ConnString))
{
.....//使用这个连接conn
}
}

void Process_3()
{
using(SqlConnection conn1=new SqlConnection(ConnString))
{
.....//使用这个连接conn1
using(SqlConnection conn2=new SqlConnection(ConnString))
{
.....//使用这个连接conn2
}
}
using(SqlConnection conn3=new SqlConnection(ConnString))
{
.....//使用这个连接conn3
}
}

这都是好的编程方法。
------解决方案--------------------
需要的时候就如sp1234所言!
------解决方案--------------------
完全楼上
sp1234(想象力真的那么难吗?)
的想法.
我一直也用这个方法
------解决方案--------------------
在.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);
}
}
}

以上都是伪代码.
你也可以做其它的方法来实现。
------解决方案--------------------
学习
------解决方案--------------------
学习了
------解决方案--------------------
支持 sp1234(想象力真的那么难吗?) 学习。
------解决方案--------------------
mark
------解决方案--------------------
支持 sp1234(想象力真的那么难吗?) 学习