ProcessStateBagMariaDb.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using MySql.Data.MySqlClient;
  2. using SinMaiLauncher.Models;
  3. namespace SinMaiLauncher.ChildProcessHolder;
  4. internal class ProcessStateBagMariaDb(ILogger<ProcessStateBagMariaDb> logger, SettingReader infra) : ChildProcessStateBagForConsole(ChildProcessKind.MariaDb, infra.Maria)
  5. {
  6. protected override async Task<bool> CheckReadyAsync()
  7. {
  8. if (await base.CheckReadyAsync())
  9. {
  10. //尝试连接
  11. const int timeoutSecond = 15;
  12. const int retryIntervalMs = 1000; // 每秒重试一次
  13. var startTime = DateTime.Now;
  14. var setting = infra.Settings.Infra.MariaDb;
  15. var connectionString = $"Server={setting.Host};Port={setting.Port};Uid={setting.Usr};Pwd={setting.Pwd};";
  16. while (DateTime.Now - startTime < TimeSpan.FromSeconds(timeoutSecond))
  17. {
  18. try
  19. {
  20. await using var connection = new MySqlConnection(connectionString);
  21. logger.LogInformation($"Attempting to connect to MySQL at {setting.Host}:{setting.Port}");
  22. await connection.OpenAsync();
  23. return true; // 连接成功
  24. }
  25. catch (MySqlException ex)
  26. {
  27. logger.LogWarning(ex, "Connection failed. Retrying...");
  28. await Task.Delay(retryIntervalMs);
  29. }
  30. catch (Exception ex)
  31. {
  32. logger.LogError(ex, "Unexpected error during connection attempt");
  33. return false;
  34. }
  35. }
  36. }
  37. return false;
  38. }
  39. }