Esempio n. 1
0
        /// <summary>
        /// 获取从库的连接字符串( 读取规则,当所有的从库无法使用的时候读取返回主库的连接字符串)
        /// </summary>
        /// <param name="dbContextType"></param>
        /// <returns></returns>
        private string SlaveConnection(Type dbContextType)
        {
            //获取从库的信息
            var slaveList = SlavePools.slaveConnec.Where(a => a.Key == dbContextType).Select(a => a.Value).FirstOrDefault();

            SlaveDbConnection slaveInfo = null;

            if (slaveList != null && slaveList.Count() > 0)
            {
                slaveInfo = slaveList.Where(a => a.IsAvailable).OrderBy(a => Guid.NewGuid()).FirstOrDefault();
            }

            if (slaveInfo == null)
            {
                return(options.WriteReadConnectionString);
            }
            //进行心跳检查
            var isBeat = SlavePools.HeartBeatCheck(dbContextType, slaveInfo);

            if (isBeat == false)
            {
                return(SlaveConnection(dbContextType));
            }
            return(slaveInfo.ConnectionString);
        }
Esempio n. 2
0
 /// <summary>
 /// 执行心跳检查 检查从库是否正在运行
 /// </summary>
 /// <param name="slaveConnections">从库的连接字符串</param>
 /// <param name="dbcontext">上下文类型</param>
 internal static bool HeartBeatCheck(Type dbcontext, SlaveDbConnection slaveConnections)
 {
     using var tcpClient = new TcpClient();
     try
     {
         //连接tcp服务器
         tcpClient.Connect(slaveConnections.HostName, slaveConnections.Port);
     }
     catch (Exception)
     {
         slaveConnec.Where(a => a.Key == dbcontext).Select(a => a.Value).FirstOrDefault()?.ForEach(item =>
         {
             if (item == slaveConnections)
             {
                 item.IsAvailable = false;
             }
         });
         logger.LogInformation($"SlavePools:当前{slaveConnections.ConnectionString}从库的无法连接");
         return(false);
     }
     return(true);
 }