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