Skip to content

Commit 1bf0f33

Browse files
committed
freesql verify by redis
1 parent dd56c70 commit 1bf0f33

6 files changed

Lines changed: 78 additions & 49 deletions

File tree

src/Midjourney.API/Controllers/AdminController.cs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
using System.Runtime.InteropServices;
2929
using System.Text.Json;
3030
using System.Text.RegularExpressions;
31+
using System.Threading.Tasks;
3132
using CSRedis;
3233
using FreeSql;
3334
using LiteDB;
@@ -1887,8 +1888,31 @@ public async Task<Result> SettingEdit([FromBody] Setting setting)
18871888
}
18881889
}
18891890

1891+
// 如果启用了 redis 则验证
1892+
// 先验证 redis
1893+
if (setting.IsValidRedis)
1894+
{
1895+
try
1896+
{
1897+
var csredis = new CSRedisClient(setting.RedisConnectionString);
1898+
if (!csredis.Ping())
1899+
{
1900+
return Result.Fail("Redis 连接失败,请检查连接字符串是否正确");
1901+
}
1902+
}
1903+
catch (Exception ex)
1904+
{
1905+
Log.Error(ex, "Redis 连接失败");
1906+
return Result.Fail("Redis 连接失败,请检查连接字符串是否正确");
1907+
}
1908+
}
1909+
else
1910+
{
1911+
return Result.Fail("必须配置 Redis 模式");
1912+
}
1913+
18901914
// 数据库验证
1891-
var dbSuccess = FreeSqlHelper.Verify(setting.DatabaseType, setting.DatabaseConnectionString);
1915+
var dbSuccess = await FreeSqlHelper.Verify(setting.DatabaseType, setting.DatabaseConnectionString);
18921916
if (!dbSuccess)
18931917
{
18941918
return Result.Fail("数据库连接失败,请检查连接字符串/名称是否正确");
@@ -1924,27 +1948,6 @@ public async Task<Result> SettingEdit([FromBody] Setting setting)
19241948
}
19251949
}
19261950

1927-
// 如果启用了 redis 则验证
1928-
if (setting.IsValidRedis)
1929-
{
1930-
try
1931-
{
1932-
var csredis = new CSRedisClient(setting.RedisConnectionString);
1933-
if (!csredis.Ping())
1934-
{
1935-
return Result.Fail("Redis 连接失败,请检查连接字符串是否正确");
1936-
}
1937-
}
1938-
catch (Exception ex)
1939-
{
1940-
Log.Error(ex, "Redis 连接失败");
1941-
return Result.Fail("Redis 连接失败,请检查连接字符串是否正确");
1942-
}
1943-
}
1944-
else
1945-
{
1946-
return Result.Fail("必须配置 Redis 模式");
1947-
}
19481951

19491952
// 如果启用了风控验证
19501953
if (setting.EnableRiskControlAutoCaptcha)
@@ -2024,7 +2027,7 @@ public Result CancelUpdate()
20242027
/// <param name="request"></param>
20252028
/// <returns></returns>
20262029
[HttpPost("validate-database-connection")]
2027-
public Result ValidateDatabaseConnection([FromBody] ValidateDatabaseRequest request)
2030+
public async Task<Result> ValidateDatabaseConnection([FromBody] ValidateDatabaseRequest request)
20282031
{
20292032
if (_isAnonymous)
20302033
{
@@ -2062,7 +2065,7 @@ public Result ValidateDatabaseConnection([FromBody] ValidateDatabaseRequest requ
20622065
// }
20632066
//}
20642067

2065-
var success = FreeSqlHelper.Verify(request.DatabaseType!.Value, request.DatabaseConnectionString);
2068+
var success = await FreeSqlHelper.Verify(request.DatabaseType!.Value, request.DatabaseConnectionString);
20662069
if (success)
20672070
{
20682071
return Result.Ok();

src/Midjourney.API/DiscordAccountInitializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public async Task StartAsync(CancellationToken cancellationToken)
131131
{
132132
try
133133
{
134-
var migOK = FreeSqlHelper.Verify(setting.MigrateDatabaseType, setting.MigrateDatabaseConnectionString);
134+
var migOK = await FreeSqlHelper.Verify(setting.MigrateDatabaseType, setting.MigrateDatabaseConnectionString);
135135
if (migOK)
136136
{
137137
var _mgFreesql = FreeSqlHelper.Init(setting.MigrateDatabaseType, setting.MigrateDatabaseConnectionString);

src/Midjourney.API/Midjourney.API.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
1010
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
1111
<SatelliteResourceLanguages>zh-Hans</SatelliteResourceLanguages>
12-
<AssemblyVersion>11.7.2</AssemblyVersion>
12+
<AssemblyVersion>11.7.3</AssemblyVersion>
1313
<DockerfileContext>..\..</DockerfileContext>
1414
</PropertyGroup>
1515

src/Midjourney.API/Program.cs

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,26 +117,8 @@ public static async Task Main(string[] args)
117117
isSaveSetting = true;
118118
}
119119

120-
// 验证数据库是否可连接
121-
if (!FreeSqlHelper.VerifyConfigure())
122-
{
123-
// 切换为本地数据库
124-
setting.DatabaseType = DatabaseType.SQLite;
125-
isSaveSetting = true;
126-
127-
// 切换为 SQLite
128-
var freeSql = FreeSqlHelper.Init(setting.DatabaseType, setting.DatabaseConnectionString, true);
129-
if (freeSql != null)
130-
{
131-
FreeSqlHelper.Configure(freeSql);
132-
}
133-
134-
Log.Error("数据库连接失败,自动切换为 SQLite 数据库");
135-
}
136-
137-
Log.Information("数据库类型:{0}", setting.DatabaseType);
138-
139120
// 初始化 Redis 验证是否可连接
121+
// 需要先验证 Redis 是否可连接,后续会用到 Redis
140122
if (setting.IsValidRedis)
141123
{
142124
try
@@ -148,6 +130,11 @@ public static async Task Main(string[] args)
148130
isSaveSetting = true;
149131
Log.Error("Redis 连接失败,已自动禁用 Redis 功能");
150132
}
133+
else
134+
{
135+
SettingService.Instance.ApplyRedis();
136+
Log.Information("Redis 连接成功,已启用 Redis 功能");
137+
}
151138
}
152139
catch (Exception ex)
153140
{
@@ -157,6 +144,25 @@ public static async Task Main(string[] args)
157144
}
158145
}
159146

147+
// 验证数据库是否可连接
148+
if (!await FreeSqlHelper.VerifyConfigure())
149+
{
150+
// 切换为本地数据库
151+
setting.DatabaseType = DatabaseType.SQLite;
152+
isSaveSetting = true;
153+
154+
// 切换为 SQLite
155+
var freeSql = FreeSqlHelper.Init(setting.DatabaseType, setting.DatabaseConnectionString, true);
156+
if (freeSql != null)
157+
{
158+
FreeSqlHelper.Configure(freeSql);
159+
}
160+
161+
Log.Error("数据库连接失败,自动切换为 SQLite 数据库");
162+
}
163+
164+
Log.Information("数据库类型:{0}", setting.DatabaseType);
165+
160166
// 需要重新保存配置,注意:如果版本过旧,重新保存配置可能会覆盖新的业务,需谨慎处理
161167
if (isSaveSetting)
162168
{

src/Midjourney.Base/Data/FreeSqlHelper.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
// invasion of privacy, or any other unlawful purposes is strictly prohibited.
2323
// Violation of these terms may result in termination of the license and may subject the violator to legal action.
2424

25+
using System.Threading.Tasks;
2526
using FreeSql;
2627
using FreeSql.Aop;
2728
using FreeSql.DataAnnotations;
29+
using Midjourney.Base.Util;
2830
using Newtonsoft.Json.Linq;
2931
using Serilog;
3032

@@ -216,10 +218,10 @@ public static IFreeSql Init(DatabaseType databaseType, string databaseConnection
216218
/// 验证并配置数据库连接
217219
/// </summary>
218220
/// <returns></returns>
219-
public static bool VerifyConfigure()
221+
public static async Task<bool> VerifyConfigure()
220222
{
221223
var setting = GlobalConfiguration.Setting;
222-
var isSuccess = Verify(setting.DatabaseType, setting.DatabaseConnectionString);
224+
var isSuccess = await Verify(setting.DatabaseType, setting.DatabaseConnectionString);
223225
if (isSuccess)
224226
{
225227
// 验证成功后,确认配置当前数据库
@@ -240,10 +242,18 @@ public static bool VerifyConfigure()
240242
/// <param name="databaseConnectionString"></param>
241243
/// <param name="isConfigure">验证成功后是否配置</param>
242244
/// <returns></returns>
243-
public static bool Verify(DatabaseType databaseType, string databaseConnectionString)
245+
public static async Task<bool> Verify(DatabaseType databaseType, string databaseConnectionString)
244246
{
245247
try
246248
{
249+
// 数据连接验证要加锁,防止多服务器同时启动变更数据库时导致字段/结构同步冲突
250+
await using var isLock = await AdaptiveLock.LockAsync("FreeSql.Verify", 60);
251+
if(!isLock.IsAcquired)
252+
{
253+
Log.Error("无法获取 FreeSql 验证锁,可能存在多个服务器同时启动导致数据库连接验证冲突");
254+
return false;
255+
}
256+
247257
switch (databaseType)
248258
{
249259
//case DatabaseType.MongoDB:

src/Midjourney.Services/SettingService.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,17 @@ public void ApplySettings()
117117
GlobalConfiguration.TranslateService = null;
118118
}
119119

120-
// 缓存 / Redis / Reids 锁
120+
// 应用 Redis
121+
ApplyRedis();
122+
}
123+
124+
/// <summary>
125+
/// 应用 Redis
126+
/// 缓存 / Redis / Reids 锁
127+
/// </summary>
128+
public void ApplyRedis()
129+
{
130+
var setting = Current;
121131
if (setting.IsValidRedis)
122132
{
123133
var csredis = new CSRedisClient(setting.RedisConnectionString);

0 commit comments

Comments
 (0)