一千次的打开关闭数据库,慢

microtan0902 2008-12-07 10:41:22

private ArrayList FormatDataReader(SqlDataReader datareader)
{
string readString = "";

int i=0;
string[] sql = new string[1000000];//用来存储生成的sql语句

while (datareader.Read())
{
sql[i++] = @"select distinct(mirbase.dbo.chr1.rs#) from mirbase.dbo.chr1
where mirbase.dbo.chr1.pos between "+datareader[5].ToString()+" and "+datareader[6].ToString();//此处生成n条sql语句,下面执行这n条sql语句 将其返回值给textbox2.text
}

SqlConnection myConnection = new SqlConnection(SQLCONNECTIONSTRING);

int k = 0;

while(sql[k]!=null)//此处循环1000次
{
SqlCommand myCommand = new SqlCommand(sql[k], myConnection);
myConnection.Open();
SqlDataReader dr = myCommand.ExecuteReader(CommandBehavior.CloseConnection);//经测试就是 一千次打开关闭数据库慢,数据库表做了索引应该速度可以

while (dr.Read())
{
for (int j = 0; j < dr.FieldCount; j++)//显示所有列
readString += dr[j].ToString() + "\t";
readString += "\r\n";
}
TextBox2.Text += readString;
dr.Close();
k++;
}
myConnection.Close();
datareader.Close();
return (null);
}


工作的核心是查询,大概1000条查询。
每一个都是select distinct(mirbase.dbo.chr1.rs#) from mirbase.dbo.chr1
where mirbase.dbo.chr1.pos between 数组1 and 数组2;变化的就是数组1和数组2对应的数字,大概有1000对。
所以要进行一千次的打开关闭数据库。访问速度很慢,大概进行了3分钟,不知道有没有什么优化办法来提高效率那
...全文
162 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
swalp 2008-12-07
  • 打赏
  • 举报
回复
不太懂这些东西。我来逛街
liningln0 2008-12-07
  • 打赏
  • 举报
回复
1.考虑一下你 这个1000个左右的数据是不是都是要一定每次执行完再做其他的数据处理操作,如果是的话可以连接数据库操作放在最外层,在做完所有的数据库操作后在关闭数据库。如:
SqlCommand myCommand = new SqlCommand(sql[k], myConnection);
myConnection.Open();
while(sql[k]!=null)//此处循环1000次
{
//数据库的SQL语句。
}
myConnection.Close();
datareader.Close();
2.再次优化你的查询的条件。使得1000次查询尽可能减少。
3.建议你更改表结构,如果每次都的访问那么多个表,想想为什么非的把数据完全分开呢 ?为什么不能放在一个或者几个表中呢?

总结,楼主所遇到的问题应该和软件开始的架构也有一定的问题。希望用上面的方法能解决。
风骑士之怒 2008-12-07
  • 打赏
  • 举报
回复
不要每次都连接数据库又断开,放在循环外,全部结束做个判断来释放资源,或者using(){}的形式来及时释放资源,或者多线程 and so on...
GTX280 2008-12-07
  • 打赏
  • 举报
回复
myConnection.Open();
放在循环外面
wuyq11 2008-12-07
  • 打赏
  • 举报
回复
多线程实现或通过存储过程实现查询
长沙三毛 2008-12-07
  • 打赏
  • 举报
回复
1)关键:不执行myConnection.Close()语句;
2)在该函数的调用方法中产生myConnection并Open()、Close(),或更高层方法中做这个操作
hongzao 2008-12-07
  • 打赏
  • 举报
回复
还有lz的最初的代码本身就有问题,因为你是在循环里打开了1000链接,但是你真正的关闭只有在循环外面作了一次,这样会造成大量(999次)的资源泄露。
hongzao 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 microtan0902 的回复:]
引用 5 楼 liningln0 的回复:
SqlCommand myCommand = new SqlCommand(sql[k], myConnection);
myConnection.Open();
while(sql[k]!=null)//此处循环1000次
{
//数据库的SQL语句。
}
myConnection.Close();
datareader.Close();
2.再次优化你的查询的条件。使得…

这样恐怕不行,如果这样做 while的1000次循环执行的都是1个sql语句。我1000次循环需要的是不同的sql语句,他们存在sql[k]这次数组里面。
[/Quote]
把myConnection.Open()和myConnection.Close()放在循环外面。SqlCommand myCommand = new SqlCommand(sql[k], myConnection); 放在循环里,这样就可以避免多次打开SqlConnection和关闭SqlConnection而造成不必要的时间和性能上的浪费
风骑士之怒 2008-12-07
  • 打赏
  • 举报
回复
你这个测试如果用途是什么,说说你这个程序的意义先,myConnection.ConnectionString=...
microtan0902 2008-12-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liningln0 的回复:]
SqlCommand myCommand = new SqlCommand(sql[k], myConnection);
myConnection.Open();
while(sql[k]!=null)//此处循环1000次
{
//数据库的SQL语句。
}
myConnection.Close();
datareader.Close();
2.再次优化你的查询的条件。使得…
[/Quote]
这样恐怕不行,如果这样做 while的1000次循环执行的都是1个sql语句。我1000次循环需要的是不同的sql语句,他们存在sql[k]这次数组里面。

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧