日期:2014-05-16  浏览次数:20564 次

Sql Server数据库连接是否需要每次都打开?

书本上告诉我们,当执行数据库操作时,首先需要打开一个数据库连接,然后执行数据库操作,最后,再关闭数据库连接。

使用asp和php编程时都是这样处理的。

后来使用java+hibernate+mysql,通过hibernate配置连接池,

可直接通过new HibernateEntityLoader().getSession();获得一个数据库连接,未曾考虑连接效率或会存在什么问题。


此前用.Net写C/S结构的程序,客户端直接连数据库,前辈告诉我,SqlConnection不用每次都现打开,可以一直打开,最后才关闭。

我感觉说的非常有道理,每次都执行数据库操作,开门、关门的岂不是很麻烦,于是采用此种方式。


最近,将写服务器端,采用WebService方式,客户端不再直接连接数据库。

测试时,就发现DataReader未关闭错误,虽然没有使用SqlDataReader,但是还是报错,想必一个数据库连接不够?冲突了?更重要的是隔一段时间,客户端无法登录,显示连接未初始化,虽然我每隔10分钟激活一下数据库连接。


于是,增加了10静态个数据库连接,每次随机取一个Open状态的连接,结果这回客户端报错,虽然不同客户端访问获得的SessionID不一样,但是发现返回的DataTable串了,别的客户端返回的数据会到另一客户端。


于是没办法,只能老实的用Open和Close。但还是存在疑问,每次都Open和Close是否会影响效率。

今日做了一个测试,循环已完成,第一次时间差异在177毫秒,后来都保持在89毫秒。这下放心了,真应验了一个网友说的话,Sql Server没那么傻,他会管理好自己的连接池。

            // 测试数据库连接打开速度
            string connString = "Data Source=127.0.0.1;Initial Catalog=dbname;Integrated Security=False;User Id=it;Password=it";
            DateTime startDate = DateTime.Now;
            for (int i = 0; i < 10000; i++)
            {
                SqlConnection conn = new SqlConnection();
                conn.ConnectionString = connString;
                conn.Open();
                SqlCommand comd = new SqlCommand();
                comd.Connection = conn;
                comd.CommandText = "select getDate()";
                comd = null;
                conn.Close();
            }
            Console.WriteLine(DateTime.Now - startDate);