c# 4.0-Parallel.For并行录入10万条数据出错

问题描述

Parallel.For并行录入10万条数据出错

用了一个CodeTimer测试性能,在循环方法体的时候,老大说让用Parallel.For代替for循环。

结果瞬间快了100倍的测试速度,但是又出现一个问题了,数据录不进去了。

经常循环10万次才录入一条,断点调试后发现就第一条录进去了,后面的都是数据库连接池错误。

我想问下用并行之后,这种情况是正常的吗,如果不正常,有什么方法解决呢

代码中的Time()的三个参数,第一个是方法名(无视),第二个是循环次数,第三个是方法体,关于Time()方法我也列出来,详情可以看http://blog.zhaojie.me/2009/03/codetimer.html

 Time("注册性能", 100, () =>
            {
                try
                {
                    User user = new User() { UserName = Guid.NewGuid().ToString(), Password = "123" };
                    ips.Register(user);
                }
                catch(Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            });

Timer方法体

 public static void Initialize()
        {
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            Time("", 1, () => { });
        }

        public static void Time(string name, int iteration, Action action)
        {
            if (String.IsNullOrEmpty(name)) return;

            // 1.
            ConsoleColor currentForeColor = Console.ForegroundColor;
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(name);

            // 2.
            GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
            int[] gcCounts = new int[GC.MaxGeneration + 1];
            for (int i = 0; i <= GC.MaxGeneration; i++)
            {
                gcCounts[i] = GC.CollectionCount(i);
            }

            // 3.
            Stopwatch watch = new Stopwatch();
            watch.Start();
            ulong cycleCount = GetCycleCount();
            //for (int i = 0; i < iteration; i++) action();
            Parallel.For(0, iteration, (i) => { action(); });
            ulong cpuCycles = GetCycleCount() - cycleCount;
            watch.Stop();

            // 4.
            Console.ForegroundColor = currentForeColor;
            Console.WriteLine("tTime Elapsed:t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
            Console.WriteLine("tCPU Cycles:t" + cpuCycles.ToString("N0"));

            // 5.
            for (int i = 0; i <= GC.MaxGeneration; i++)
            {
                int count = GC.CollectionCount(i) - gcCounts[i];
                Console.WriteLine("tGen " + i + ": tt" + count);
            }

            Console.WriteLine();
        }

        private static ulong GetCycleCount()
        {
            ulong cycleCount = 0;
            QueryThreadCycleTime(GetCurrentThread(), ref cycleCount);
            return cycleCount;
        }

        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime);

        [DllImport("kernel32.dll")]
        static extern IntPtr GetCurrentThread();

解决方案

可能你的连接池用完了,因为你用的并行,获取连接池的时候数据库的处理较慢,连接释放的慢,导致连接池里的连接不够用。

时间: 2024-09-12 21:15:42

c# 4.0-Parallel.For并行录入10万条数据出错的相关文章

mysql 插入10万条数据 优化效率

问题描述 mysql 插入10万条数据 优化效率 public int addTypes(List<taobaoBean> babyList) { String sql = "insert into type (typeid,url) values (?,?) "; Connection conn = dbhelper.getConnection(driver,url,username,upwd); int result = 0; PreparedStatement stm

oracle数据库中怎么一次性插入10万条数据

问题描述 oracle数据库中怎么一次性插入10万条数据 oracle数据库中怎么一次性插入10万条数据?急用!!!1 解决方案 最快的方法是用imp进行导入 或者用sql执行也可以(insert into )

怎样快速的向SQL-2000里插入10万条数据啊?

问题描述 本人刚参加了一个公司的笔试,有这样一道题,想到了一个笨方法,但速度比较慢,有没有比较快速的方法,向数据库里插入10万条数据?谢谢了... 解决方案 解决方案二:BULKINSERT解决方案三:能不能说的清楚点,还是不明白.解决方案四:在SQL联机帮助里找找看,网上搜索下也行的.解决方案五:有点难度哦

ASP三种方法抽取10万条数据的速度测试

数据|速度 现有10W条数据,Access数据库保存 通过正常提取: <% Set conn= Server.CreateObject("ADODB.Connection") connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb") conn.Open connstr Set rs = Server.CreateObject

用存储过程、GetRows()、抽取10万条数据的速度测试_应用技巧

现有10W条数据,Access数据库保存 通过正常提取:  复制代码 代码如下: <%  Set conn= Server.CreateObject("ADODB.Connection")  c&Server.MapPath("db2.mdb")  conn.Open connstr  Set rs = Server.CreateObject ("ADODB.Recordset")  sql = "Select * fro

抽取10万条数据,想起GetRows()_应用技巧

现有10W条数据,Access数据库保存 通过正常提取: <%Set conn= Server.CreateObject("ADODB.Connection")connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb")conn.Open connstr Set rs = Server.CreateObject ("A

抽取10万条数据,想起GetRows()

现有10W条数据,Access数据库保存 通过正常提取: <% Set conn= Server.CreateObject("ADODB.Connection") connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("db2.mdb") conn.Open connstr Set rs = Server.CreateObject (&quo

车船税法草案10万条意见过半公众要求降税

车船税法草案收到近10万条 意见 过半公众要求降税 (记者 邢飞) 全国人大常委会昨天通过中国人大网,公布了征求社会公众对车船税法草案意见的情况.统计显示,在本次征求意见过程中,中国人大网收到22832位网民提出的97295条意见,要求对草案进行修改.降低税负的53137条,占54.62 %. 自2010年10月28日18:30至11月30日24:00,全国人大常委会通过中国人大网向社会公开征求对<中华人民共和国车船税法草案>以下简称"草案"的意见,中国人大网共收到9729

大数据 算法-数据库中有10万条记录,list中有5万条,怎样不通过for循环找出相同的数据?

问题描述 数据库中有10万条记录,list中有5万条,怎样不通过for循环找出相同的数据? java 中 .数据库中有10万条记录 list中有5万条 ,怎样不通过for循环,找出数据库和list中相同的数据? 解决方案 list中的数据批量导入临时表,跟那10W条数据对比,对比完一批删一批,得出相同数据插入另一张临时表, 解决方案二: 其实如果你只是找出相同的数据,你可以直接用SQL接可以了!我写一个SQL语句 select count(*),colName from tableName t