本人写了一个在服务器端自动运行的代码(不是由客户端请求来响应执行的),完成整个过程,需要多次读取写入数据库(当然是不同的表),现在问题是,新建关闭一个数据库链接(sqlconnection)是比较费时的,那么我是让整个代码共用一个数据库连接,全部执行完后再关闭还是说每单次数据库操作就新建一个连接然后关掉呢?哪个更少耗资源,时间开销较少呢?也许要分两个情况来讨论:
1,这个过程的代码逻辑本身比较耗时间,比如说完成整个过程要1分钟。
2,比较不耗时间,完成整个过程需时10秒以内。大家看如何取舍?

解决方案 »

  1.   

    和楼主类似,这问题我也正纳闷,我做一个网站,首页上用了3个Repeater控件绑定数据库,代码如下,
    OleDbHelper dataaccess = new OleDbHelper();
    string sql_news = "SELECT TOP 5 iif(len(arttitle)>24 ……";
    OleDbDataReader dr_news = dataaccess.GetDataReader(sql_news);
    Repeater1.DataSource = dr_news;string sql_business = "SELECT TOP 3 iif(len(arttitle)>22,……";
    OleDbDataReader dr_business = dataaccess.GetDataReader(sql_business);
    Repeater2.DataSource = dr_business;string sql_cuxiao = "SELECT TOP 3 iif(len(arttitle)>26……";
    OleDbDataReader dr_cuxiao = dataaccess.GetDataReader(sql_cuxiao);
    Repeater3.DataSource = dr_cuxiao;Page.DataBind();GetDataReader()方法的定义如下:
    public OleDbDataReader GetDataReader(string sqlstr)
        {
            OleDbConnection conn = CreateConnection();
            OleDbCommand cmd = new OleDbCommand(sqlstr, conn);
            OleDbDataReader dr = null;
            try
            {
                conn.Open();
                dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
            return dr;
        }
    这里面每执行一次dataaccess.GetDataReader(sql_cuxiao)方法,就经过了连接、打开、读取、关闭数据库(Access),我不知道我这样写合不合规范,有什么方法可以改进吗?这三个datareader读取的是不同表中的数据,用一条SQL语句一次读取出来貌似难以做到,如果我改下GetDataReader方法呢,就是执行三个不同的SQL语句进行查询时,采用一个数据库连接对象,这样做,是不是可以提高性能呢?不过这样做,如果采用分层开发,DAL层只提供一个GetDataReader()方法,貌似难以实现啊?请高手指点下。
      

  2.   

    2楼的问题,完全可以一次取出数据集,再进行查询。参考 datatable select 的方法
      

  3.   

    先获取数据到dataSet保存到缓存,通过缓存获取
    活泼数据库操作类,连接及时关闭
      

  4.   

    取一次dataset,然后全弄完在写回去,比一直占用着强,毕竟有连接池吗,不用每次都新建连接
      

  5.   

    各位说的好像对操作单个表有效,用dataset,当然是不要交互了,完事再写回去,但是我说的情况是多表,各种操作都有的。不会把整个数据库的表都搬到内存吧?