VFPOledb驱动程序可能内存泄漏

本文关键字:内存 泄漏 驱动程序 VFPOledb | 更新日期: 2023-09-27 17:52:41

我正在c#中开发一个程序,该程序使用vfpoledb驱动程序将大约100,000行插入到版本4的数据库文件(*.dbf)中。

返回连接字符串的方法如下:

<>之前GetDBaseConnectionString(字符串路径){返回"Provider=vfpoledb;数据源=" + path + ";排序序列=general;";}之前

执行插入操作的代码段如下:

        internal long Execute()
        {
            OleDbConnection con = null;
            OleDbCommand cmd = null;
            try
            {
                con = new OleDbConnection(AppSettings.Current.GetDBaseConnectionString(_dbfPath));
                con.Open();
                cmd = new OleDbCommand(_sql);
                cmd.Connection = con;                
                cmd.CommandTimeout = AppSettings.Current.DefaultCommandTimeOutMinutes;
                long rowIndex = 0;
                int countInBatch = 0;
                for (int i = 0; i < _reader.FieldCount; i++)
                    cmd.Parameters.Add(new OleDbParameter());                
                while (_reader.Read())
                {
                    for (int i = 0; i < cmd.Parameters.Count; i++)
                        cmd.Parameters[i].Value = _reader.GetValue(i);
                    cmd.ExecuteNonQuery();
                    rowIndex += 1;
                    if (_progressChangeRowCount > 0)
                    {
                        countInBatch += 1;
                        if (countInBatch >= _progressChangeRowCount)
                        {
                            countInBatch = 0;
                            ProgressChangedEventArgs args = new ProgressChangedEventArgs(rowIndex);
                            this.OnProgressChanged(args);
                        }
                    }
                }
                _reader.Close();
                con.Close();
                con.Dispose();
                cmd.Dispose();
                return rowIndex;
            }
            catch (Exception ex)
            {                
                if (con != null)
                {
                    con.Close();
                    con.Close();
                }
                if (cmd != null)
                    cmd.Dispose();
                if(_reader!= null)
                    _reader.Close();
                throw ex;
            }
        }

此段在三个线程中并发运行。因此数据从3个sqldatareader同时插入到3个数据库文件中。

我的问题是,我的程序消耗大约50-100 MB每分钟,它只增加,直到我关闭程序。因为这个系统。程序中会引发outofmemoryexception异常,操作系统很快就会关闭它。我可以看到任务管理器中的页面文件使用从540mb变为2.2 GB。

我已经把它缩小到cmd.ExecuteNonQuery();如果我注释掉这一行,程序执行时只会增加大约1或2 MB的内存。

因此

  1. 这可能是由于内存泄漏在VFPOledb驱动程序?我使用的是最新版本9
  2. 如果是,我能做些什么来应对?(将其包装为一个单独的进程,以便操作系统在退出时清理任何内存泄漏听起来很诱人,但应该是最后的手段)
  3. 您是否看到或知道任何其他可能导致此问题的故障?
  4. 更换驱动程序可能会有所帮助,但Jet驱动程序速度慢得令人痛苦。数据库批量插入还有其他选择吗?我也问过这个问题在这里有效的方式批量插入到数据库(.dbf)文件

VFPOledb驱动程序可能内存泄漏

经过多次尝试后,我将这段代码包装在一个单独的进程中,以便操作系统在它退出后进行清理。这是我能找到的最好的解决方案。