Skip to content

Commit f824d23

Browse files
committed
数据库自动重连
1 parent d19cf78 commit f824d23

5 files changed

Lines changed: 131 additions & 26 deletions

File tree

ColoryrServer/Core/DataBase/MSCon.cs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using ColoryrServer.FileSystem;
22
using ColoryrServer.SDK;
33
using System;
4+
using System.Collections.Concurrent;
45
using System.Collections.Generic;
56
using System.Data.SqlClient;
67
using System.Text;
@@ -12,12 +13,12 @@ public class MSCon
1213
/// <summary>
1314
/// 连接状态
1415
/// </summary>
15-
public static Dictionary<int, bool> State = new();
16-
16+
private static Dictionary<int, bool> State = new();
1717
/// <summary>
1818
/// 连接池
1919
/// </summary>
2020
private static Dictionary<int, string> ConnectStr = new();
21+
private static ConcurrentDictionary<int, bool> Connecting = new();
2122
private static List<SQLConfig> Config;
2223

2324
/// <summary>
@@ -49,6 +50,44 @@ private static bool Test(SqlConnection item)
4950
}
5051
}
5152

53+
/// <summary>
54+
/// 尝试重连数据库
55+
/// </summary>
56+
/// <param name="id">数据库ID</param>
57+
/// <returns>是否能连接</returns>
58+
internal static bool Contains(int id)
59+
{
60+
if (State.ContainsKey(id) && State[id])
61+
return true;
62+
else if (Config.Count - 1 >= id)
63+
{
64+
if (Connecting.ContainsKey(id))
65+
return false;
66+
if (!Connecting.TryAdd(id, true))
67+
return false;
68+
var config = Config[id];
69+
if (!config.Enable)
70+
return false;
71+
var pass = Encoding.UTF8.GetString(Convert.FromBase64String(config.Password));
72+
string ConnectString = string.Format(config.Conn, config.IP, config.User, pass);
73+
State.Add(id, false);
74+
var Conn = new SqlConnection(ConnectString);
75+
if (Test(Conn))
76+
{
77+
ConnectStr.Add(id, ConnectString);
78+
State[id] = true;
79+
ServerMain.LogOut($"Mysql数据库{id}已连接");
80+
}
81+
else
82+
{
83+
ServerMain.LogError($"Mysql数据库{id}连接失败");
84+
}
85+
Connecting.TryRemove(id, out var v);
86+
return State[id];
87+
}
88+
return false;
89+
}
90+
5291
/// <summary>
5392
/// MSCon初始化
5493
/// </summary>

ColoryrServer/Core/DataBase/MysqlCon.cs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using ColoryrServer.SDK;
33
using MySql.Data.MySqlClient;
44
using System;
5+
using System.Collections.Concurrent;
56
using System.Collections.Generic;
67
using System.Text;
78

@@ -12,13 +13,13 @@ public class MysqlCon
1213
/// <summary>
1314
/// 连接状态
1415
/// </summary>
15-
public static Dictionary<int, bool> State = new();
16-
16+
private static Dictionary<int, bool> State = new();
1717
/// <summary>
1818
/// 连接池
1919
/// </summary>
2020
private static List<SQLConfig> Config;
2121
private static Dictionary<int, string> ConnectStr = new();
22+
private static ConcurrentDictionary<int, bool> Connecting = new();
2223

2324
/// <summary>
2425
/// 连接测试
@@ -49,6 +50,44 @@ private static bool Test(MySqlConnection item)
4950
}
5051
}
5152

53+
/// <summary>
54+
/// 尝试重连数据库
55+
/// </summary>
56+
/// <param name="id">数据库ID</param>
57+
/// <returns>是否能连接</returns>
58+
internal static bool Contains(int id)
59+
{
60+
if (State.ContainsKey(id) && State[id])
61+
return true;
62+
else if (Config.Count - 1 >= id)
63+
{
64+
if (Connecting.ContainsKey(id))
65+
return false;
66+
if (!Connecting.TryAdd(id, true))
67+
return false;
68+
var config = Config[id];
69+
if (!config.Enable)
70+
return false;
71+
var pass = Encoding.UTF8.GetString(Convert.FromBase64String(config.Password));
72+
string ConnectString = string.Format(config.Conn, config.IP, config.Port, config.User, pass);
73+
State.Add(id, false);
74+
var Conn = new MySqlConnection(ConnectString);
75+
if (Test(Conn))
76+
{
77+
ConnectStr.Add(id, ConnectString);
78+
State[id] = true;
79+
ServerMain.LogOut($"Mysql数据库{id}已连接");
80+
}
81+
else
82+
{
83+
ServerMain.LogError($"Mysql数据库{id}连接失败");
84+
}
85+
Connecting.TryRemove(id, out var v);
86+
return State[id];
87+
}
88+
return false;
89+
}
90+
5291
/// <summary>
5392
/// Mysql初始化
5493
/// </summary>

ColoryrServer/Core/DataBase/OracleCon.cs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using ColoryrServer.SDK;
33
using Oracle.ManagedDataAccess.Client;
44
using System;
5+
using System.Collections.Concurrent;
56
using System.Collections.Generic;
67
using System.Text;
78

@@ -12,12 +13,12 @@ public class OracleCon
1213
/// <summary>
1314
/// 连接状态
1415
/// </summary>
15-
public static Dictionary<int, bool> State = new();
16-
16+
private static Dictionary<int, bool> State = new();
1717
/// <summary>
1818
/// 连接池
1919
/// </summary>
2020
private static List<SQLConfig> Config;
21+
private static ConcurrentDictionary<int, bool> Connecting = new();
2122
private static Dictionary<int, string> ConnectStr = new();
2223

2324
/// <summary>
@@ -48,6 +49,44 @@ private static bool Test(OracleConnection item)
4849
}
4950
}
5051

52+
/// <summary>
53+
/// 尝试重连数据库
54+
/// </summary>
55+
/// <param name="id">数据库ID</param>
56+
/// <returns>是否能连接</returns>
57+
internal static bool Contains(int id)
58+
{
59+
if (State.ContainsKey(id) && State[id])
60+
return true;
61+
else if (Config.Count - 1 >= id)
62+
{
63+
if (Connecting.ContainsKey(id))
64+
return false;
65+
if (!Connecting.TryAdd(id, true))
66+
return false;
67+
var config = Config[id];
68+
if (!config.Enable)
69+
return false;
70+
var pass = Encoding.UTF8.GetString(Convert.FromBase64String(config.Password));
71+
string ConnectString = string.Format(config.Conn, config.IP, config.Port, config.User, pass);
72+
State.Add(id, false);
73+
var Conn = new OracleConnection(ConnectString);
74+
if (Test(Conn))
75+
{
76+
ConnectStr.Add(id, ConnectString);
77+
State[id] = true;
78+
ServerMain.LogOut($"Mysql数据库{id}已连接");
79+
}
80+
else
81+
{
82+
ServerMain.LogError($"Mysql数据库{id}连接失败");
83+
}
84+
Connecting.TryRemove(id, out var v);
85+
return State[id];
86+
}
87+
return false;
88+
}
89+
5190
/// <summary>
5291
/// Oracle初始化
5392
/// </summary>

ColoryrServer/Core/Resources/DatabaseSDK.txt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ namespace ColoryrServer.SDK
2828
{
2929
this.ID = ID;
3030
this.Database = Database;
31-
if (!MysqlCon.State.ContainsKey(ID))
31+
if (!MysqlCon.Contains(ID))
3232
throw new ErrorDump($"û��Mysql���ݿ�{ID}");
33-
if (MysqlCon.State[ID] == false)
34-
throw new ErrorDump("Mysql���");
3533
if (string.IsNullOrWhiteSpace(Database))
3634
throw new ErrorDump("û��ѡ�����ݿ�");
3735
}
@@ -143,10 +141,8 @@ namespace ColoryrServer.SDK
143141
{
144142
this.Database = Database;
145143
this.ID = ID;
146-
if (!MSCon.State.ContainsKey(ID))
147-
throw new ErrorDump($"û��Mysql���ݿ�{ID}");
148-
if (MSCon.State[ID] == false)
149-
throw new ErrorDump("MS���ݿ�û������");
144+
if (!MSCon.Contains(ID))
145+
throw new ErrorDump($"û��MS���ݿ�{ID}");
150146
if (string.IsNullOrWhiteSpace(Database))
151147
throw new ErrorDump("û��ѡ�����ݿ�");
152148

@@ -243,10 +239,8 @@ namespace ColoryrServer.SDK
243239
public Oracle(string Database = "", int ID = 0)
244240
{
245241
this.ID = ID;
246-
if (!OracleCon.State.ContainsKey(ID))
242+
if (!OracleCon.Contains(ID))
247243
throw new ErrorDump($"û��Oracle���ݿ�{ID}");
248-
if (OracleCon.State[ID] == false)
249-
throw new ErrorDump("Oracleû������");
250244
if (string.IsNullOrWhiteSpace(Database))
251245
throw new ErrorDump("û��ѡ�����ݿ�");
252246
this.Database = Database;

ColoryrServer/Core/SDK/DatabaseSDK.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,8 @@ public Mysql(string Database, int ID = 0)
2828
{
2929
this.ID = ID;
3030
this.Database = Database;
31-
if (!MysqlCon.State.ContainsKey(ID))
31+
if (!MysqlCon.Contains(ID))
3232
throw new ErrorDump($"没有Mysql数据库{ID}");
33-
if (MysqlCon.State[ID] == false)
34-
throw new ErrorDump("Mysql未就绪");
3533
if (string.IsNullOrWhiteSpace(Database))
3634
throw new ErrorDump("没有选择数据库");
3735
}
@@ -143,10 +141,8 @@ public MSsql(string Database, int ID = 0)
143141
{
144142
this.Database = Database;
145143
this.ID = ID;
146-
if (!MSCon.State.ContainsKey(ID))
147-
throw new ErrorDump($"没有Mysql数据库{ID}");
148-
if (MSCon.State[ID] == false)
149-
throw new ErrorDump("MS数据库没有链接");
144+
if (!MSCon.Contains(ID))
145+
throw new ErrorDump($"没有MS数据库{ID}");
150146
if (string.IsNullOrWhiteSpace(Database))
151147
throw new ErrorDump("没有选择数据库");
152148

@@ -243,10 +239,8 @@ public class Oracle
243239
public Oracle(string Database = "", int ID = 0)
244240
{
245241
this.ID = ID;
246-
if (!OracleCon.State.ContainsKey(ID))
242+
if (!OracleCon.Contains(ID))
247243
throw new ErrorDump($"没有Oracle数据库{ID}");
248-
if (OracleCon.State[ID] == false)
249-
throw new ErrorDump("Oracle没有链接");
250244
if (string.IsNullOrWhiteSpace(Database))
251245
throw new ErrorDump("没有选择数据库");
252246
this.Database = Database;

0 commit comments

Comments
 (0)