您的位置:首页 > 数据库

电话号码归属地查询——验证sqlserver数据库支持同时多线程操作数据表

2011-12-05 21:07 337 查看
---------------------- android培训java培训、期待与您交流! ----------------------

由于要入学传智播客asp.net黑马班必须经过严格的入学考试,而写技术blog则是这个入学考试非常重要的一个环节。我说过我不是个勤快的人,所以这对我来说,这个就自然是个比较难的一个环节。但能怎么着呢?要想入学,要想0元入学,要想学牛逼的技术,还得老老实实的写blog不是。按照我的习惯,要么不做,那要做就尽自己最大能力做好它。我虽不大勤快,但也不会敷衍了事。要说这技术方面,尤其是asp.net,我还真没什么经验。所以要写出什么牛逼的文章,那也是不可能的,即使说可能,那也是扯蛋。但总的写点什么,虽不说要多牛X,但总得见得人吧(自认为见得人)。所以呢,在选题的时候,我就想啊想,写点什么好呢??真是天生我才必有用,像这懒人,沿着懒人的思路,就自然想出来懒人的法子。从入学基础视频入手,扩展老师讲过的一个案例。如果有时间,我会将老师讲过的知识点,糅合在一个项目里来。但天知道有没有足够的时间来写呢,毕竟现在还有班要上,有工作要做。但我希望自己能够坚持完成。

其他的不多说,先从第一个项目开始。这个项目来源于传智播客张中科老师在asp.net基础知识ado.net中讲到的一个练手案例——电话号码归属地查询。

于是我也跟着写这个程序练手,但不幸的是我下到的电话号码段归属地信息文件只有一个文本文件,由于信息共有几十万条,文件就比较大,打开和导入数据库更慢了。我曾写单线程程序进行导数据,发现导了20多分钟,导到20多万条,但还没有结束,也不知道还有多少数据没有导入。这还不是最大的问题,更大的问题是这个程序只有一个线程(主线程),由于其一直被占用(在导数据),导致程序无法响应用户操作,像死机了一样,连关闭都做不了(单线程的缺点)。由于我实在是不想等了,就强行的结束了进程。后来学了后续的视频课程,自然就想到了用多线程来做。如果要用多线程来做,有个问题必须先解决:sqlserver数据库是否允许多线程同事操作数据表,能否用多个线程同时往一个数据表中写数据?

针对这个问题,在网上看了下,发现是可以的。于是就写了个程序验证这个问题。实际上,这个程序共验证了两个问题:

1.线程是独立运行的,但线程之间共享存储器;

2.sqlserver是支持多线程同时操作数据表的;

验证步骤:

1、新建一个数据表:T_users

id(int)
key 自动增长

name(varchar)
可为空

age(int)
可为空

2、写代码,建立两个线程,同时往表中写入数据,代码如下:
private void button1_Click(object sender, EventArgs e)
{
Thread t1 = new Thread(InsertData);
t1.IsBackground = true;
t1.Name = "T1";
t1.Start("Tom");
Console.WriteLine("t1 启动。");

Thread t2 = new Thread(InsertData);
t2.IsBackground = true;
t2.Name = "T2";
t2.Start("Jim");
Console.WriteLine("t2 启动。");
}

void InsertData(object name)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
string userName = name as string;
int userAge=0;
cmd.CommandText = "insert into t_users(name,age) values(@name,@age)";
for(userAge=0;userAge<100;userAge++)
{
Console.WriteLine(Thread.CurrentThread.Name);
userName="Jim"+userAge.ToString();
cmd.Parameters.Clear();
cmd.Parameters.Add(new SqlParameter("name",userName));
cmd.Parameters.Add(new SqlParameter("age",userAge));
cmd.ExecuteNonQuery();
}
}
}
}
运行代码,得到如下图的控制台输出



导入的数据如图:



分析以上结果可验证以上两个结论,即:

sqlserver支持多线程同步操作数据表;线程之间是共享同一个存储器的。

---------------------- android培训java培训、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐