微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

电话号码归属地查询——验证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培训、期待与您交流! ----------------------

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐