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