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

---------------------- 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培训、期待与您交流! ----------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值