ABP动态切换数据库

文章目录

背景

我们的Sql Server数据库不能支持7*24h不停机,所以只能做双主热备,这就需要我们应用层在主数据库崩坏后自动切到备用数据库,等主数据库恢复好了以后再切回来。

实现

按照官方文档新建一个resolver类。

    /// <summary>
    /// 用这两个注解替换调ABP原本默认的connection string resolver
    /// </summary>
    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(IConnectionStringResolver))]
    public class ConnectionResolver : IConnectionStringResolver, ITransientDependency
    {
        private readonly IConfiguration _configuration;

        public ConnectionResolver(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        /// <summary>
        /// 这个方法在abp源码里已经标注为Obsolete,所以基本不会调用,但是继承IConnectionStringResolver接口需要实现它
        /// </summary>
        /// <param name="connectionStringName"></param>
        /// <returns></returns>
        public virtual string Resolve(string connectionStringName = null)
        {
            return ResolveAsync(connectionStringName).Result;
        }
        /// <summary>
        /// 这也是接口强制实现的方法,ABP框架主要调用的是这个方法
        /// </summary>
        /// <param name="connectionStringName"></param>
        /// <returns></returns>
        public virtual Task<string> ResolveAsync(string connectionStringName = null)
        {
            var defaultConnection = _configuration.GetConnectionString("Default");
            var secondConnection = _configuration.GetConnectionString("Second");
            using var connection = new SqlConnection(defaultConnection);//用using释放connection
            try
            {
                connection.Open();
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();//保险起见及时关闭connection
                    return Task.FromResult(defaultConnection);//如果连接成功则返回默认连接
                }
                else
                {
                    return Task.FromResult(secondConnection);//如果连接失败则返回备选连接
                }
            }
            catch (Exception)
            {
                return Task.FromResult(secondConnection);
            }
        }
    }

这里参照ABP提供的依赖注入法,替代原来框架提供的DefaultConnectionStringResolver

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABP创建MySQL数据库的步骤如下: 1. 首先,使用ABP提供的项目模板创建一个新的项目。该模板提供了Module Zero项目,其中包含了用户、角色、权限等通用功能。然而,使用该模板连接MySQL可能会导致错误,无法正常运行。 2. 为了解决ABP+MySQL的问题,需要进行一些修改。打开源代码中的`DYDbContextConfigurer`类,该类用于配置数据库连接。在该类中,找到`Configure`方法,并将其中的代码修改如下: ```csharp public static class DYDbContextConfigurer { public static void Configure(DbContextOptionsBuilder<DYDbContext> builder, string connectionString) { builder.UseMySql(connectionString, new MySqlServerVersion(new System.Version(5, 0))); } public static void Configure(DbContextOptionsBuilder<DYDbContext> builder, DbConnection connection) { builder.UseMySql(connection, new MySqlServerVersion(new System.Version(5, 0))); } } ``` 3. 接下来,打开Web项目的Web.config文件。由于上一步添加了`MySql.Data.Entity`,所以Web.config已经添加了MySQL的相关配置。在Web.config中,找到连接字符串部分,注释掉SQL Server的连接字符串,并添加新的MySQL连接字符串。 通过以上步骤,你就可以成功创建ABP项目的MySQL数据库了。请确保你已经正确配置了MySQL数据库,并提供了正确的连接字符串。 #### 引用[.reference_title] - *1* *3* [使用ABP EntityFramework连接MySQL数据库](https://blog.csdn.net/weixin_31292909/article/details/113164152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ABP框架数据库改为MySQL](https://blog.csdn.net/daiyue945/article/details/128236930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值