甲骨文插入语句导致的内存泄漏...

cboshdave

成员
已加入
2014年12月11日
留言内容
24
编程经验
1-3
当我的程序逐步执行字典并插入记录时,我的内存使用量会逐渐增加,直到我的代码失败。我从一开始就打开与Oracle的连接,然后在整个过程中仅重用同一连接。因此,用一个大的插入语句(大约100,000次)调用以下代码会导致内存不足异常。我不确定该如何重置?

C#:
        public int ExecuteNonQuery(string sql)        {
            try
            {
                //conn.Open();
                int affected;
                //Debug.WriteLine("Connection: " + this.conn.InstanceName);
                OracleCommand cmd = conn.CreateCommand();
                cmd.CommandText = sql;
                cmd.Connection = conn;
                affected = cmd.ExecuteNonQuery();
                //mytransaction.Commit();
                return affected;
            }
            catch (Exception ex)
            {
                Console.WriteLine("OracleDataAccessManager.ExecuteNonQuery(): " + ex);
                throw ex;  //Acts the same as a return. 
            }
            finally
            {
                //conn.Close();  //Not using this section
            }


        }
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,525
地点
悉尼,澳大利亚
编程经验
10+
您是否考虑过用所有数据填充DataTable,然后使用数据适配器将批次保存为批处理?无论如何,使用包含这样的数据的字符串通常都是狡猾的。
 

cboshdave

成员
已加入
2014年12月11日
留言内容
24
编程经验
1-3
我做了进一步的测试。似乎不是这段代码。实际上,它似乎是用于创建字符串sql语句的数组。我评论了插入语句的调用,并且内存仍在增加。我正在建立一个数组,其中包含所有进入sql语句的值。使用以下代码:

string [] sItems =新字符串[92];
//现在定义所有sItem以便基于Dictionary进行插入。
int i = 0;
sItems = dictFind(sID, "GB"); i++; //field 1
sItems = "000"; i++; //field 2
sItems = dictFind(sID, "ZD"); i++; //field 3
sItems = dictFind(sID, "D2"); i++; //field 4
...

然后,我使用这些值来构建sql语句。我读了一些有关数组的内容,看来垃圾收集器应该清理它了??我很确定这就是现在"leaking"。有什么我可以做的清理吗?迭代的一部分是加载数组,然后构建sql语句并插入。然后,读取文本文件的下一行,再次加载数组,然后插入...
 

零酷

成员
已加入
2015年8月30日
留言内容
5
编程经验
3-5
我会在连接中使用using语句,然后将其他语句包装在其中。我很确定using语句将自动关闭/释放您的连接。
 
最佳 底部