首页 新闻 会员 周边 捐助

请高手们帮我看一下这个批量插入数据的方法有什么问题?

0
悬赏园豆:10 [已解决问题] 解决于 2015-06-09 14:24

我在BaseDAO里写了一个批量插入实体类的方法,

程序启动后,开始向数据库插入数据,

用的是MySQL数据库.发现插入160万条数据左右之后,(160万条数据是程序动词后,多次分批插入的).

插入160W条数据后,MySQL的进程占用内存1.3G左右.

感觉像是数据插入后,MySQL的进程没有释放内存...

 

我写的批量插入的方法如下:

  /// <summary>
        /// 在同一事务中插入个实体对象,可用不同的实体对象向多表中插入数据
        /// </summary>
        /// <param name="p">实体对象集合</param>
        /// <returns>false表示操作失败</returns>
        public bool TransInsert(List<Parent> listP)
        {
            if (listP == null || listP.Count < 1) { return true; }
            bool flag = false;
            using (DbConnection con = db.CreateConnection())
            {
                DbTransaction trans = null;
                try
                {
                    con.Open();
                    trans = con.BeginTransaction();
                    string validMsg = "";
                    foreach (Parent p in listP)
                    {
                        if (!p.InsertValid(out validMsg)) { throw new Exception("类型 " + p.ToString() + " 的实体对象中的数据未通过验证,不能保存到数据库,以下字段不符合要求:" + validMsg); }
                        Hashtable ht = p.MappingTableInfo();
                        if (p.CountFields() > 0)
                        {
                            string table = ht[Constant.STR_DB_TABLE].ToString();
                            string key = GetFields(p, DB_Condition.Key);
                            string value = GetFields(p, DB_Condition.Value);
                            string cmdText = string.Format("INSERT INTO {0}({1}) VALUES({2})", table, key, value);
                            DbCommand cmd = AddArgsReturnCMD(p, cmdText);
                            db.ExecuteNonQuery(cmd, trans);
                        }

                    }
                    trans.Commit();
                    flag = true;
                }
                catch (Exception ex)
                {
                    if (trans != null)
                    {
                        trans.Rollback();
                    }
                    Utility.Logger.Error("使用事务批量插入实体类数据时发生异常:"+ ex.Message);
                    throw new Exception("使用事务批量插入实体类数据时发生异常", ex);
                }
                finally
                {
                    if (trans != null)
                    {
                        trans.Dispose();
                    }

                }
            }
            return flag;
        }

 

麻烦帮我看下这个方法有没有什么问题?比如释放内存之类的..

非常感谢 !

hexllo的主页 hexllo | 菜鸟二级 | 园豆:318
提问于:2015-05-13 18:39
< >
分享
最佳答案
0

试试强制回收。

收获园豆:5
幻天芒 | 高人七级 |园豆:37207 | 2015-05-14 09:08

插入160万数据,用一个事务,呵呵...我就不说啥了。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-05-14 12:53

@爱编程的大叔: 是分多次插入的,就是不知道每次是多少。

幻天芒 | 园豆:37207 (高人七级) | 2015-05-14 13:02
其他回答(3)
0

为什么你学得MySQL占用1.3G内存是问题?

dudu | 园豆:30783 (高人七级) | 2015-05-13 18:44

因为我的另一台服务器,已经连续一个多月没有重启了,MySQL才占用15M的内存啊..

只是那台服务器的Insert数量比较少,一天也就几百条.

我现在批量插入数据,出现这样的情况,所以一对比,我觉得占用内存好多啊...

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2015-05-14 08:50
1

这再次证明了,编程经验不到三五年的,用事务就是吃饱了撑着。

一群完全不知道啥是事务的到处乱用。

爱编程的大叔 | 园豆:30844 (高人七级) | 2015-05-13 20:14
0

用 listP进行插入操作的时候,就不要用事务了。因为如果 listP的数据量太多的话,得不偿失。有DbConnection con = db.CreateConnection(),为什么finally 里面没有 释放 connnection呢?

收获园豆:5
熊小罗 | 园豆:207 (菜鸟二级) | 2015-05-14 07:48

因为using(...){...}这种写法据说会自动释放在using里new的对象的.

支持(0) 反对(0) hexllo | 园豆:318 (菜鸟二级) | 2015-05-14 08:48
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册