日期:2014-05-16 浏览次数:20564 次
书本上告诉我们,当执行数据库操作时,首先需要打开一个数据库连接,然后执行数据库操作,最后,再关闭数据库连接。
使用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);