我在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; }
麻烦帮我看下这个方法有没有什么问题?比如释放内存之类的..
非常感谢 !
试试强制回收。
插入160万数据,用一个事务,呵呵...我就不说啥了。
@爱编程的大叔: 是分多次插入的,就是不知道每次是多少。
为什么你学得MySQL占用1.3G内存是问题?
因为我的另一台服务器,已经连续一个多月没有重启了,MySQL才占用15M的内存啊..
只是那台服务器的Insert数量比较少,一天也就几百条.
我现在批量插入数据,出现这样的情况,所以一对比,我觉得占用内存好多啊...
这再次证明了,编程经验不到三五年的,用事务就是吃饱了撑着。
一群完全不知道啥是事务的到处乱用。
用 listP进行插入操作的时候,就不要用事务了。因为如果 listP的数据量太多的话,得不偿失。有DbConnection con = db.CreateConnection(),为什么finally 里面没有 释放 connnection呢?
因为using(...){...}这种写法据说会自动释放在using里new的对象的.