非 Azure 远程数据库上的 ReliableDbProvider 连接
ReliableDbProvider connections on remote database that is not Azure
我有使用 ADO.NET 与 SQL 服务器数据库交互的软件。我想使用 DbProviderFactories 来获得一个工厂来获得连接,以减少与数据库的耦合。
ConnectionStringSettings connectionStringEntry = ConfigurationManager.ConnectionStrings["Default"];
string providerName = connectionStringEntry.ProviderName;
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionStringEntry.ConnectionString;
等等...
我的 SQL 服务器是远程的,通过不稳定的 VPN 连接到数据中心。它不是 Azure 服务器。我确实遇到过瞬态故障。我想使用 EnterpriseLibrary.TransientFaultHandling 来帮助管理瞬态故障。我没有成功找到可以放入系统的 DbProviderFactory。data/DbProviderFactories 在我的 .config 中。
我尝试了 ReliableDbProvider NuGet。安装包后,我按照示例在工厂中添加 ReliableDbProvider.SqlAzure 提供程序,然后更改我的连接字符串以使用它。
<system.data>
<DbProviderFactories>
<add name="Reliable Provider"
invariant="ReliableDbProvider.SqlAzure"
description="Reliable DB Provider for SQL Server"
type="ReliableDbProvider.SqlAzure.SqlAzureProvider, ReliableDbProvider"/>
<add name="Sql Azure Reliable Provider With Timeout Retries"
invariant="ReliableDbProvider.SqlAzureWithTimeoutRetries"
description="Reliable Db Provider for SQL Azure with Timeout Retries"
type="ReliableDbProvider.SqlAzureWithTimeoutRetries.SqlAzureProvider, ReliableDbProvider" />
</DbProviderFactories>
</system.data>
我希望我可以假定驱动程序名称中的单词 "Azure" 并不真正意味着它特定于 Azure,而是适用于任何 SQL 服务器连接。我不相信我可以做出那个假设。当我在连接字符串中使用 providerName='ReliableDbProvider.SqlAzure' 时,我立即收到信号量超时异常。当我恢复为 providerName='System.Data.SqlClient' 时,系统会按预期运行,直到出现瞬时传输异常。我是否遗漏了一些允许我使用 ReliableDbProvider 的简单方法,或者我是否必须实现一些更复杂的方法来处理瞬态故障并仍然使用 DbProviderFactories?
我把它弄得太复杂了。我阅读了 Entlib6 手册。该库提供了 ReliableSqlConnection class。我可以在任何需要 IDbConnection 的地方使用 Connection 成员。我可以将 ReliableSqlConnection.Connection 绑定到我的依赖注入容器中的 IDbConnection。我真的不需要 ReliableDbProvider 来帮忙。
我有使用 ADO.NET 与 SQL 服务器数据库交互的软件。我想使用 DbProviderFactories 来获得一个工厂来获得连接,以减少与数据库的耦合。
ConnectionStringSettings connectionStringEntry = ConfigurationManager.ConnectionStrings["Default"];
string providerName = connectionStringEntry.ProviderName;
DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionStringEntry.ConnectionString;
等等...
我的 SQL 服务器是远程的,通过不稳定的 VPN 连接到数据中心。它不是 Azure 服务器。我确实遇到过瞬态故障。我想使用 EnterpriseLibrary.TransientFaultHandling 来帮助管理瞬态故障。我没有成功找到可以放入系统的 DbProviderFactory。data/DbProviderFactories 在我的 .config 中。
我尝试了 ReliableDbProvider NuGet。安装包后,我按照示例在工厂中添加 ReliableDbProvider.SqlAzure 提供程序,然后更改我的连接字符串以使用它。
<system.data>
<DbProviderFactories>
<add name="Reliable Provider"
invariant="ReliableDbProvider.SqlAzure"
description="Reliable DB Provider for SQL Server"
type="ReliableDbProvider.SqlAzure.SqlAzureProvider, ReliableDbProvider"/>
<add name="Sql Azure Reliable Provider With Timeout Retries"
invariant="ReliableDbProvider.SqlAzureWithTimeoutRetries"
description="Reliable Db Provider for SQL Azure with Timeout Retries"
type="ReliableDbProvider.SqlAzureWithTimeoutRetries.SqlAzureProvider, ReliableDbProvider" />
</DbProviderFactories>
</system.data>
我希望我可以假定驱动程序名称中的单词 "Azure" 并不真正意味着它特定于 Azure,而是适用于任何 SQL 服务器连接。我不相信我可以做出那个假设。当我在连接字符串中使用 providerName='ReliableDbProvider.SqlAzure' 时,我立即收到信号量超时异常。当我恢复为 providerName='System.Data.SqlClient' 时,系统会按预期运行,直到出现瞬时传输异常。我是否遗漏了一些允许我使用 ReliableDbProvider 的简单方法,或者我是否必须实现一些更复杂的方法来处理瞬态故障并仍然使用 DbProviderFactories?
我把它弄得太复杂了。我阅读了 Entlib6 手册。该库提供了 ReliableSqlConnection class。我可以在任何需要 IDbConnection 的地方使用 Connection 成员。我可以将 ReliableSqlConnection.Connection 绑定到我的依赖注入容器中的 IDbConnection。我真的不需要 ReliableDbProvider 来帮忙。