想做一个中型门户网站,预计同时在线人数可达到1000人以上,采用下面哪种数据库连接方式最合理。1、一个页面共用一个连接
   描述:页面载入时打开数据库连接,而页面中不管有多少数据操作都用这个连接,最后用完后关闭连接。2、每次会话用一个连接
   描述:用户访问时打开数据库连接,并将连接存入Session,之后的所有属于该会话的数据库操作都应用这个Session存储的连接,在Session_End时关闭连接。3、每一个操作一个连接
   描述:这好像是目前用的最多的方法。即不管同一页面需要有多少个数据库操作,每操作一次打开一个新数据库连接,用完后,立即关闭;然后又打开,又关闭。有的复杂的页面可能就需要这样开开断断十来次,性能上总感觉有点问题。
我个人认为第1种方式比较好,大家觉得呢?欢迎指导。非常感谢。或者大家还有更好的处理方式,也请不吝赐教,再次感谢。

解决方案 »

  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
      }
    }这都是好的编程方法。
      

  2.   

    TO: sp1234(想象力真的那么难吗?) ADO.net中不是已经有连接池了吗?还需要我们自己管理吗? 我想用不着吧。在你的代码中,
    using(SqlConnection conn=new SqlConnection(ConnString))
    这些都是创建一个新的数据库连接吧,开一个关一个,再开再关,这样不断重复,性能估计还是有点问题吧?
      

  3.   

    例如当同一连接有一个SqlDataReader打开的时候,对其查询运行ExecuteScalar肯定就出错了。SQL Server引擎的数据库连接不能共享。你的1、2都没有小心地考虑“不能共享”的问题。
      

  4.   

    TO:sp1234(想象力真的那么难吗?) 对于:
    SQL Server引擎的数据库连接不能共享。那么:
    用Access的数据库,数据库连接能共享吗?
      

  5.   

    其实,所谓的性能问题大概就是判断一个字符串是否相等。例如一个数据库连接字符串被编码为"asdfaf",然后以这个串作为key,将物理连接保存在连接池中。当分配新的连接时,查找连接池中又没有这个字符串。所谓性能消耗也就如此。这个匹配方法对于20年前的电脑也不能算是性能问题。
      

  6.   

    我从来不在正式开发中用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也没有考虑避免异步操作的问题。
      

  7.   

    其实,即使对于Access的ADO.NET连接,也应该使用缓冲池。使用缓冲池,性能并不下降多少,但是你的程序不论同步、异步中都没有问题,这方面是线程安全的。我以前好像也从来没有见过使用Access数据库的人考虑过异步,没有人特意承认自己的程序线程不安全,大概根本不去想。
      

  8.   

    TO:sp1234(想象力真的那么难吗?) 你使用c/s结构的Access数据库“系统”吗?没有。
    答:可以b/s结构的Access数据库“网站”就有很多了,我这里主要说网站啊。
    尽管你所说的就应该被理解为Access数据库,你的1和2也没有考虑避免异步操作的问题。
    答:是的,如果是access数据库,对于我提出的三种方法都无法避免异步问题,但目前好像也没有谁能解决好Access的异步问题。但如果能找到一个相对比较稳定,性能也比较好的方法,那也是个不错的选择。
      

  9.   

    在.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);
            }
        }
    }以上都是伪代码.
    你也可以做其它的方法来实现。