C# 4.0 如何减少Enterprise Library 5.0日志记录内存使用?
我在.NET4.0控制台应用程序中使用企业日志记录5.0。我注意到我的应用程序内存使用率非常高。我能够确定原因是由于以下呼叫:C# 4.0 如何减少Enterprise Library 5.0日志记录内存使用?,c#-4.0,logging,memory-management,enterprise-library,C# 4.0,Logging,Memory Management,Enterprise Library,我在.NET4.0控制台应用程序中使用企业日志记录5.0。我注意到我的应用程序内存使用率非常高。我能够确定原因是由于以下呼叫: var logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>(); 使用execution文件夹中的验证和数据DLL,是否可以在不增加内存使用的情况下初始化logwriter 更新: 因此,在entlib源代码中进行一些调试之后。我相信下面将查找dll并实例化Valida
var logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
使用execution文件夹中的验证和数据DLL,是否可以在不增加内存使用的情况下初始化logwriter
更新:
因此,在entlib源代码中进行一些调试之后。我相信下面将查找dll并实例化Validation.dll和Data.dll,尽管在项目中根本没有被引用
来自EntLib50Src\Blocks\Common\Src\Configuration\ContainerModel\TypeLoadingLocator.cs
dbProviderFactorys.GetFactory(dbProviderName)在dbProviderName=Oracle.DataAccess.Client.OracleClientFactory导致巨大内存峰值时调用
因此,造成巨大内存峰值的原因似乎是由于odp.net及其注册的DBF工厂
如果不注册执行程序集位置中的所有内容,我似乎无法创建记录器。理想情况下,我不想注册数据访问,除非它明确告诉我。ODP.NET被用作底层提供程序的事实是内存峰值的主要原因,GetDefaultMapping无论如何都会返回null。可以进行以下更改:
private static DbProviderMapping GetDefaultMapping(string dbProviderName)
{
// try to short circuit by default name
if (DbProviderMapping.DefaultSqlProviderName.Equals(dbProviderName))
return defaultSqlMapping;
if (DbProviderMapping.DefaultOracleProviderName.Equals(dbProviderName))
return defaultOracleMapping;
if (dbProviderName != "Oracle.DataAccess.Client")
{
// get the default based on type
var providerFactory = DbProviderFactories.GetFactory(dbProviderName);
if (SqlClientFactory.Instance == providerFactory)
return defaultSqlMapping;
if (OracleClientFactory.Instance == providerFactory)
return defaultOracleMapping;
}
return null;
}
这仍然不能解释为什么Oracle.DataAccess.Client会在以下方面使用如此多的内存:
dbProviderFactorys.GetFactory(dbProviderName)代码>
以及它为什么要向容器注册数据访问。ODP.NET被用作底层提供程序的事实是内存峰值的主要原因,GetDefaultMapping无论如何都会返回null。可以进行以下更改:
private static DbProviderMapping GetDefaultMapping(string dbProviderName)
{
// try to short circuit by default name
if (DbProviderMapping.DefaultSqlProviderName.Equals(dbProviderName))
return defaultSqlMapping;
if (DbProviderMapping.DefaultOracleProviderName.Equals(dbProviderName))
return defaultOracleMapping;
if (dbProviderName != "Oracle.DataAccess.Client")
{
// get the default based on type
var providerFactory = DbProviderFactories.GetFactory(dbProviderName);
if (SqlClientFactory.Instance == providerFactory)
return defaultSqlMapping;
if (OracleClientFactory.Instance == providerFactory)
return defaultOracleMapping;
}
return null;
}
这仍然不能解释为什么Oracle.DataAccess.Client会在以下方面使用如此多的内存:
dbProviderFactorys.GetFactory(dbProviderName)代码>
以及为什么要在容器中注册数据访问。也在这里创建了一个讨论:也在这里创建了一个讨论:我要分析dbProviderFactorys.GetFactory(“Oracle.DataAccess.Client”);为了理解为什么需要这么多内存,我将分析dbProviderFactorys.GetFactory(“Oracle.DataAccess.Client”);去理解为什么需要这么多的记忆
private static DbProviderMapping GetDefaultMapping(string dbProviderName)
{
// try to short circuit by default name
if (DbProviderMapping.DefaultSqlProviderName.Equals(dbProviderName))
return defaultSqlMapping;
if (DbProviderMapping.DefaultOracleProviderName.Equals(dbProviderName))
return defaultOracleMapping;
// get the default based on type
var providerFactory = DbProviderFactories.GetFactory(dbProviderName);
if (SqlClientFactory.Instance == providerFactory)
return defaultSqlMapping;
if (OracleClientFactory.Instance == providerFactory)
return defaultOracleMapping;
return null;
}
private static DbProviderMapping GetDefaultMapping(string dbProviderName)
{
// try to short circuit by default name
if (DbProviderMapping.DefaultSqlProviderName.Equals(dbProviderName))
return defaultSqlMapping;
if (DbProviderMapping.DefaultOracleProviderName.Equals(dbProviderName))
return defaultOracleMapping;
if (dbProviderName != "Oracle.DataAccess.Client")
{
// get the default based on type
var providerFactory = DbProviderFactories.GetFactory(dbProviderName);
if (SqlClientFactory.Instance == providerFactory)
return defaultSqlMapping;
if (OracleClientFactory.Instance == providerFactory)
return defaultOracleMapping;
}
return null;
}