首先定义多个连接字符串并配置于appsettings.json,通过ConnectionStringManager实现轮询获取;结合健康检查与重试机制,在GetValidConnectionAsync中尝试连接并自动故障转移;最后在EF Core的DbContext中动态应用连接字符串,并通过依赖注入注册服务,实现多服务器切换与高可用。
在C#中实现数据库连接字符串轮换和多服务器切换,主要是为了提升系统的可用性和负载均衡能力。当主数据库不可用时,程序可以自动切换到备用数据库,避免服务中断。以下是具体实现思路和代码示例。
将多个数据库服务器的连接信息配置在appsettings.json
或web.config
中,便于维护和扩展。
以appsettings.json
为例:
<font face="Consolas, 'Courier New', monospace"> { "ConnectionStrings": [ "Server=server1;Database=mydb;User Id=user;Password=pass;", "Server=server2;Database=mydb;User Id=user;Password=pass;", "Server=server3;Database=mydb;User Id=user;Password=pass;" ] } </font>
在Program.cs
或Startup.cs
中读取这些配置:
<font face="Consolas, 'Courier New', monospace"> var connectionStrings = Configuration.GetSection("ConnectionStrings").Get<string[]>(); </font>
可以通过轮询(Round-Robin)或随机选择的方式从多个连接字符串中选取一个使用。
示例:简单轮询实现
<font face="Consolas, 'Courier New', monospace"> public class ConnectionStringManager { private readonly string[] _connectionStrings; private int _currentIndex = 0; public ConnectionStringManager(string[] connectionStrings) { _connectionStrings = connectionStrings; } public string GetNextConnectionString() { var connStr = _connectionStrings[_currentIndex]; _currentIndex = (_currentIndex + 1) % _connectionStrings.Length; return connStr; } } </font>
仅轮换不够智能,需结合健康检查。尝试连接并捕获异常,失败则切换到下一个。
示例:带重试机制的数据库连接方法
<font face="Consolas, 'Courier New', monospace"> public async Task<SqlConnection> GetValidConnectionAsync( string[] connectionStrings, int maxRetries = 3) { foreach (var connStr in connectionStrings) { for (int i = 0; i < maxRetries; i++) { try { var connection = new SqlConnection(connStr); await connection.OpenAsync(); return connection; // 成功则返回 } catch (SqlException) { await Task.Delay(100); // 简单重试延迟 continue; } } } throw new InvalidOperationException("所有数据库服务器均无法连接。"); } </font>
若使用Entity Framework Core,可在OnConfiguring
或依赖注入中动态指定连接字符串。
示例:在DbContext
中使用轮换管理器
<font face="Consolas, 'Courier New', monospace"> public class MyDbContext : DbContext { private readonly ConnectionStringManager _connManager; public MyDbContext(ConnectionStringManager connManager) { _connManager = connManager; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { var connStr = _connManager.GetNextConnectionString(); optionsBuilder.UseSqlServer(connStr); } } } </font>
注册服务时注入管理器:
<font face="Consolas, 'Courier New', monospace"> services.AddSingleton(new ConnectionStringManager(connectionStrings)); services.AddDbContext<MyDbContext>(); </font>
以上就是如何用C#实现数据库的连接字符串轮换?多服务器切换?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号