Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何减少Enterprise Library 5.0日志记录内存使用?_C# 4.0_Logging_Memory Management_Enterprise Library - Fatal编程技术网

C# 4.0 如何减少Enterprise Library 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

我在.NET4.0控制台应用程序中使用企业日志记录5.0。我注意到我的应用程序内存使用率非常高。我能够确定原因是由于以下呼叫:

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;
    }