修为内置连接池

This commit is contained in:
sin365 2025-02-25 10:31:51 +08:00
parent f1850ac37e
commit 48f465c35e
14 changed files with 472 additions and 739 deletions

View File

@ -1,202 +0,0 @@
using MySql.Data.MySqlClient;
namespace AxibugEmuOnline.Server.Common
{
public static class SQLPool
{
static Queue<MySqlConnection> _ConQueue = new Queue<MySqlConnection>();
static Dictionary<MySqlConnection, Haoyue_PoolTime> _OutOfSQLPool = new Dictionary<MySqlConnection, Haoyue_PoolTime>();
static Dictionary<string, long> _DicSqlRunFunNum = new Dictionary<string, long>();
static Dictionary<string, long> _DicTimeOutSqlRunFunNum = new Dictionary<string, long>();
const int DefaultCount = 1;
const int MaxLimit = 5;
static readonly object _sync = new object();
static MySqlConnectionStringBuilder connBuilder;
public static void InitConnMgr()
{
connBuilder = new MySqlConnectionStringBuilder();
connBuilder.Database = Config.cfg.DBName;
connBuilder.Server = Config.cfg.DBIp;
connBuilder.UserID = Config.cfg.DBUname;
connBuilder.Password = Config.cfg.DBPwd;
connBuilder.Port = Config.cfg.DBPort;
//connBuilder.MinimumPoolSize = 40u;
//connBuilder.MaximumPoolSize = 100u;
connBuilder.Pooling = true;
Console.WriteLine("SQLPool连接初始化....");
for (int i = 0; i < DefaultCount; i++)
{
MySqlConnection _conn = conn();
_conn.Open();
_ConQueue.Enqueue(_conn);
}
Console.WriteLine("SQLPool初始化完毕,连接数" + _ConQueue.Count);
}
public static MySqlConnection conn()
{
return new MySqlConnection(connBuilder.ConnectionString);
}
public static MySqlConnection DequeueSQLConn(string FuncStr)
{
Console.WriteLine($"[DequeueSQLConn]{FuncStr}");
lock (_sync)
{
if (_DicSqlRunFunNum.ContainsKey(FuncStr))
{
_DicSqlRunFunNum[FuncStr]++;
}
else
{
_DicSqlRunFunNum[FuncStr] = 1L;
}
MySqlConnection _conn = null;
if (_ConQueue.Count < 1)
{
Console.WriteLine("[DequeueSQLConn]创建新的SQLPool.Count>" + _ConQueue.Count);
_conn = conn();
_conn.Open();
}
else
{
MySqlConnection temp = null;
while (_ConQueue.Count > 0)
{
Console.WriteLine("[DequeueSQLConn]取出一个SQLCount.Count>" + _ConQueue.Count);
temp = _ConQueue.Dequeue();
if (temp.State == System.Data.ConnectionState.Closed)
{
Console.WriteLine("[DequeueSQLConn]已经断开SQLCount.Count>" + _ConQueue.Count);
temp.Dispose();
temp = null;
continue;
}
}
if (temp != null)
{
_conn = temp;
}
else
{
Console.WriteLine("[DequeueSQLConn]连接池全部已断开,重新创建连接");
_conn = conn();
_conn.Open();
}
}
_OutOfSQLPool.Add(_conn, new Haoyue_PoolTime
{
time = time(),
FuncStr = FuncStr
});
return _conn;
}
}
public static void EnqueueSQLConn(MySqlConnection BackConn)
{
lock (_sync)
{
if (_OutOfSQLPool.ContainsKey(BackConn))
{
_OutOfSQLPool.Remove(BackConn);
}
else
{
Console.WriteLine("出队遗漏的数据出现了!");
}
if (_ConQueue.Count > MaxLimit)
{
Console.WriteLine("已经不需要回收了,多余了,SQLPool.Count>" + _ConQueue.Count);
BackConn.Close();
BackConn.Dispose();
BackConn = null;
}
else
{
_ConQueue.Enqueue(BackConn);
Console.WriteLine("回收SQLPool.Count>" + _ConQueue.Count);
}
}
}
public static void CheckPoolTimeOut()
{
lock (_sync)
{
long now = time();
List<MySqlConnection> removeTemp = new List<MySqlConnection>();
foreach (KeyValuePair<MySqlConnection, Haoyue_PoolTime> o2 in _OutOfSQLPool)
{
if (now - o2.Value.time >= 120)
{
if (_DicTimeOutSqlRunFunNum.ContainsKey(o2.Value.FuncStr))
{
_DicTimeOutSqlRunFunNum[o2.Value.FuncStr]++;
}
else
{
_DicTimeOutSqlRunFunNum[o2.Value.FuncStr] = 1L;
}
if (_ConQueue.Count > MaxLimit)
{
Console.WriteLine("[超时回收]" + o2.Value.FuncStr + "已经不需要回收了,多余了,SQLPool.Count>" + _ConQueue.Count);
o2.Key.Close();
}
else
{
Console.WriteLine("[超时回收]" + o2.Value.FuncStr + "回收SQLPool.Count>" + _ConQueue.Count);
_ConQueue.Enqueue(o2.Key);
}
removeTemp.Add(o2.Key);
}
}
if (removeTemp.Count() <= 0)
{
return;
}
foreach (MySqlConnection o in removeTemp)
{
if (_OutOfSQLPool.ContainsKey(o))
{
_OutOfSQLPool.Remove(o);
Console.WriteLine("[超时回收]_OutOfSQLPool清理");
}
else
{
Console.WriteLine("[超时回收]_OutOfSQLPool清理异常");
}
}
Console.WriteLine("[超时回收]处理结束SQLPool.Count>" + _ConQueue.Count);
}
}
public static long time()
{
return Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);
}
public static void GetPoolState()
{
Console.WriteLine("-----------------查询统计-----------------");
foreach (KeyValuePair<string, long> dic2 in _DicSqlRunFunNum)
{
Console.WriteLine(dic2.Key + ":" + dic2.Value);
}
Console.WriteLine("-----------------超时统计-----------------");
foreach (KeyValuePair<string, long> dic in _DicTimeOutSqlRunFunNum)
{
Console.WriteLine(dic.Key + ":" + dic.Value);
}
Console.WriteLine("------------------------------------------");
}
}
public class Haoyue_PoolTime
{
public long time { get; set; }
public string FuncStr { get; set; }
}
}

View File

@ -0,0 +1,72 @@
using MySql.Data.MySqlClient;
namespace AxibugEmuOnline.Server.Common
{
public static class SQLRUN
{
// 移除自定义队列和状态跟踪字典
private static Dictionary<string, long> _DicSqlRunFunNum = new Dictionary<string, long>();
private static Dictionary<string, long> _DicTimeOutSqlRunFunNum = new Dictionary<string, long>();
const int DefaultCount = 1;
const int MaxLimit = 10;
static readonly object _sync = new object();
static MySqlConnectionStringBuilder connBuilder;
public static void InitConnMgr()
{
// 配置 MySQL 内置连接池
connBuilder = new MySqlConnectionStringBuilder
{
Database = Config.cfg.DBName,
Server = Config.cfg.DBIp,
UserID = Config.cfg.DBUname,
Password = Config.cfg.DBPwd,
Port = Config.cfg.DBPort,
Pooling = true, // 启用内置连接池
MinimumPoolSize = DefaultCount, // 最小连接数
MaximumPoolSize = MaxLimit, // 最大连接数
};
// 初始化时不手动创建连接,依赖连接池自动管理
Console.WriteLine("SQLPool初始化完成连接池参数已配置");
}
public static MySqlConnection GetConn(string FuncStr)
{
lock (_sync)
{
IncrementFuncCall(FuncStr);
// 直接使用 MySQL 内置连接池获取连接
var conn = new MySqlConnection(connBuilder.ConnectionString);
conn.Open();
return conn;
}
}
public static void GetPoolState()
{
Console.WriteLine("-----------------查询统计-----------------");
foreach (var entry in _DicSqlRunFunNum)
{
Console.WriteLine($"函数 {entry.Key} 调用次数: {entry.Value}");
}
Console.WriteLine("-----------------超时统计-----------------");
foreach (var entry in _DicTimeOutSqlRunFunNum)
{
Console.WriteLine($"函数 {entry.Key} 超时次数: {entry.Value}");
}
Console.WriteLine("------------------------------------------");
}
#region
private static void IncrementFuncCall(string funcStr)
{
_DicSqlRunFunNum[funcStr] = _DicSqlRunFunNum.ContainsKey(funcStr) ? _DicSqlRunFunNum[funcStr] + 1 : 1;
}
#endregion
}
}

View File

@ -24,7 +24,7 @@ namespace AxibugEmuOnline.Server
g_Log = new LogManager();
Config.LoadConfig();
AESHelper.LoadKeyIVCfg(Config.cfg.AesKey, Config.cfg.AesIv);
SQLPool.InitConnMgr();
SQLRUN.InitConnMgr();
g_Tick = new TickManager();
g_ClientMgr = new ClientManager();
g_ClientMgr.Init(45000, 120);

View File

@ -21,7 +21,8 @@ namespace AxibugEmuOnline.Server.Manager
ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(_socket);
Protobuf_Game_Mark_RESP respData = new Protobuf_Game_Mark_RESP();
MySqlConnection conn = SQLPool.DequeueSQLConn("RecvGameMark");
using (MySqlConnection conn = SQLRUN.GetConn("RecvGameMark"))
{
try
{
string query = "SELECT id from rom_stars where uid = ?uid and romid = ?romid";
@ -92,11 +93,11 @@ namespace AxibugEmuOnline.Server.Manager
catch (Exception e)
{
}
}
respData.Stars = GetRomStart(msg.RomID);
respData.IsStar = CheckIsRomStar(msg.RomID, _c.UID) ? 1 : 0;
SQLPool.EnqueueSQLConn(conn);
respData.RomID = msg.RomID;
AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdGameMark, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(respData));
}
@ -104,7 +105,8 @@ namespace AxibugEmuOnline.Server.Manager
public int GetRomStart(int RomId)
{
int stars = 0;
MySqlConnection conn = SQLPool.DequeueSQLConn("GetStart");
using (MySqlConnection conn = SQLRUN.GetConn("GetStart"))
{
try
{
string query = $"SELECT `stars` FROM romlist where id = ?romid;";
@ -126,14 +128,15 @@ namespace AxibugEmuOnline.Server.Manager
{
AppSrv.g_Log.Error(e);
}
SQLPool.EnqueueSQLConn(conn);
}
return stars;
}
public bool CheckIsRomStar(int RomId, long uid)
{
bool bhad = false;
MySqlConnection conn = SQLPool.DequeueSQLConn("CheckIsRomStart");
using (MySqlConnection conn = SQLRUN.GetConn("CheckIsRomStart"))
{
try
{
string query = $"SELECT count(id) from rom_stars where uid = ?uid and romid = ?romid";
@ -154,9 +157,9 @@ namespace AxibugEmuOnline.Server.Manager
}
catch (Exception e)
{
AppSrv.g_Log.Error("CheckIsRomStar"+e);
AppSrv.g_Log.Error("CheckIsRomStar" + e);
}
}
SQLPool.EnqueueSQLConn(conn);
return bhad;
}
@ -166,7 +169,8 @@ namespace AxibugEmuOnline.Server.Manager
return ptype;
ptype = RomPlatformType.Invalid;
MySqlConnection conn = SQLPool.DequeueSQLConn("GetRomPlatformType");
using (MySqlConnection conn = SQLRUN.GetConn("GetRomPlatformType"))
{
try
{
string query = "SELECT PlatformType from romlist where Id = ?RomID ";
@ -188,12 +192,11 @@ namespace AxibugEmuOnline.Server.Manager
{
AppSrv.g_Log.Error(e);
}
}
if (ptype == RomPlatformType.Invalid)
AppSrv.g_Log.Error($"RomID {RomID} 没找到平台配置");
SQLPool.EnqueueSQLConn(conn);
return ptype;
}
}

View File

@ -79,7 +79,8 @@ namespace AxibugEmuOnline.Server.Manager
bool bDone = false;
ClientInfo _c = AppSrv.g_ClientMgr.GetClientForSocket(socket);
Protobuf_Modify_NickName msg = ProtoBufHelper.DeSerizlize<Protobuf_Modify_NickName>(reqData);
MySqlConnection conn = SQLPool.DequeueSQLConn("ModifyNikeName");
using (MySqlConnection conn = SQLRUN.GetConn("ModifyNikeName"))
{
try
{
string query = "update users set nikename = ?nikename where uid = ?uid ";
@ -97,7 +98,7 @@ namespace AxibugEmuOnline.Server.Manager
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
}
if (bDone)
{
@ -132,7 +133,8 @@ namespace AxibugEmuOnline.Server.Manager
{
uid = 0;
bool bDone = true;
MySqlConnection conn = SQLPool.DequeueSQLConn("GetUidByDevice");
using (MySqlConnection conn = SQLRUN.GetConn("GetUidByDevice"))
{
try
{
string query = "SELECT uid from user_devices where device = ?deviceStr ";
@ -202,7 +204,7 @@ namespace AxibugEmuOnline.Server.Manager
AppSrv.g_Log.Error($"ex=>{e.ToString()}");
bDone = false;
}
SQLPool.EnqueueSQLConn(conn);
}
if (uid <= 0)
bDone = false;
@ -211,7 +213,8 @@ namespace AxibugEmuOnline.Server.Manager
public void UpdateUserData(long uid, ClientInfo _c, DeviceType deviceType)
{
MySqlConnection conn = SQLPool.DequeueSQLConn("UpdateUserData");
using (MySqlConnection conn = SQLRUN.GetConn("UpdateUserData"))
{
try
{
string query = "SELECT account,nikename,regdate,lastlogindate from users where uid = ?uid ";
@ -245,7 +248,7 @@ namespace AxibugEmuOnline.Server.Manager
{
}
SQLPool.EnqueueSQLConn(conn);
}
}
static string GenToken(ClientInfo _c)

View File

@ -108,11 +108,10 @@ namespace AxibugEmuOnline.Server
Leave = 2
}
public void RoomLog(long uid, int platform, int RoomID, int RomID, RoomLogType state)
{
MySqlConnection conn = SQLPool.DequeueSQLConn("RoomLog");
try
{
string query = "INSERT INTO `haoyue_emu`.`room_log` (`uid`, `platform`, `romid`,`roomid`, `state`) VALUES ( ?uid, ?platform, ?romid, ?roomid, ?state);";
using (MySqlConnection conn = SQLRUN.GetConn("RoomLog"))
{
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
@ -134,10 +133,6 @@ namespace AxibugEmuOnline.Server
}
}
}
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
}
#endregion
@ -240,7 +235,7 @@ namespace AxibugEmuOnline.Server
Data_RoomData newRoom = new Data_RoomData();
RomPlatformType ptype = AppSrv.g_GameShareMgr.GetRomPlatformType(msg.GameRomID);
newRoom.Init(GetNewRoomID(), msg.GameRomID, msg.GameRomHash, _c.UID, false,ptype);
newRoom.Init(GetNewRoomID(), msg.GameRomID, msg.GameRomHash, _c.UID, false, ptype);
AddRoom(newRoom);
ErrorCode joinErrcode = ErrorCode.ErrorOk;
//加入
@ -1291,7 +1286,7 @@ namespace AxibugEmuOnline.Server
}
AppSrv.g_Log.Debug($"Join _c.UID->{_c.UID} RoomID->{RoomID}");
Dictionary<uint, (uint, GamePadType)> slotInfo = new Dictionary<uint, (uint, GamePadType)>();
slotInfo[slotIdx] = (joyIdx,GamePadType.GlobalGamePad);
slotInfo[slotIdx] = (joyIdx, GamePadType.GlobalGamePad);
SetPlayerSlotData(_c, ref slotInfo);
int newPlayerCount = GetPlayerCount();
errcode = ErrorCode.ErrorOk;

View File

@ -28,11 +28,11 @@ namespace AxibugEmuOnline.Server.Manager
respData.SavDataList.Add(nulldata);
respData.SavDataList.Add(nulldata);
respData.SavDataList.Add(nulldata);
MySqlConnection conn = SQLPool.DequeueSQLConn("RecvGameMark");
try
{
string query = "SELECT `id`,`uid`,`romid`, `savidx`, `savName`,`savNote`, `savUrl`,`savImgUrl`, `savDate` from user_gamesavedata where uid = ?uid and romid = ?romid";
bool bHad = false;
using (MySqlConnection conn = SQLRUN.GetConn("RecvGameMark"))
{
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
@ -60,12 +60,7 @@ namespace AxibugEmuOnline.Server.Manager
}
}
}
}
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
respData.RomID = msg.RomID;
AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdGamesavGetGameSavList, (int)ErrorCode.ErrorOk, ProtoBufHelper.Serizlize(respData));
@ -79,10 +74,10 @@ namespace AxibugEmuOnline.Server.Manager
ErrorCode errCode = ErrorCode.ErrorOk;
respData.RomID = msg.RomID;
bool bHad = false; string SavUrl = null; string SavImgUrl = null;
MySqlConnection conn = SQLPool.DequeueSQLConn("RecvGameMark");
try
{
string query = "SELECT `savUrl`,`savImgUrl`, `savDate` from user_gamesavedata where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (MySqlConnection conn = SQLRUN.GetConn("RecvGameMark"))
{
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
@ -98,10 +93,6 @@ namespace AxibugEmuOnline.Server.Manager
}
}
}
}
catch (Exception e)
{
}
if (!bHad)
{
@ -119,7 +110,7 @@ namespace AxibugEmuOnline.Server.Manager
{
try
{
string query = "delete from user_gamesavedata where uid = ?uid and romid = ?romid and savidx = ?savidx";
query = "delete from user_gamesavedata where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
@ -134,8 +125,8 @@ namespace AxibugEmuOnline.Server.Manager
catch { }
}
}
}
SQLPool.EnqueueSQLConn(conn);
if (errCode == ErrorCode.ErrorOk)
{
@ -174,7 +165,6 @@ namespace AxibugEmuOnline.Server.Manager
if (errCode == ErrorCode.ErrorOk)
{
MySqlConnection conn = SQLPool.DequeueSQLConn("RecvUpLoadGameSav");
byte[] StateRawData = msg.StateRaw.ToArray();
byte[] ImgData = msg.SavImg.ToArray();
GetNewRomPath(_c.UID, ptype, msg.RomID, msg.SavDataIdx, $"{msg.SavDataIdx}.axisav", out string rompath);
@ -190,6 +180,9 @@ namespace AxibugEmuOnline.Server.Manager
" ( `uid`, `romid`, `savidx`, `savName`, `savNote`, `savUrl`, `savImgUrl`, `savDate`)" +
" VALUES ( ?uid, ?romid, ?savidx, ?savName, ?savNote, ?savUrl, ?savImgUrl, ?savDate);";
using (MySqlConnection conn = SQLRUN.GetConn("RecvUpLoadGameSav"))
{
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
@ -207,8 +200,7 @@ namespace AxibugEmuOnline.Server.Manager
}
}
}
SQLPool.EnqueueSQLConn(conn);
}
}
@ -273,7 +265,8 @@ namespace AxibugEmuOnline.Server.Manager
bool bhad = false;
protoData = default;
RomPlatformType ptype = AppSrv.g_GameShareMgr.GetRomPlatformType(romid);
MySqlConnection conn = SQLPool.DequeueSQLConn("GetProtobufMineGameSavInfo");
using (MySqlConnection conn = SQLRUN.GetConn("GetProtobufMineGameSavInfo"))
{
try
{
string query = "SELECT `id`,`uid`, `romid`, `savidx`, `savName`, `savNote`, `savUrl`, `savImgUrl`, `savDate` from `user_gamesavedata` where uid = ?uid and romid = ?romid and savidx = ?savidx";
@ -310,7 +303,7 @@ namespace AxibugEmuOnline.Server.Manager
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
}
return bhad;
}
@ -318,8 +311,7 @@ namespace AxibugEmuOnline.Server.Manager
{
bool bDone = false;
RomPlatformType ptype = AppSrv.g_GameShareMgr.GetRomPlatformType(romid);
MySqlConnection conn = SQLPool.DequeueSQLConn("DeleteProtobufMineGameSavInfo");
try
using (MySqlConnection conn = SQLRUN.GetConn("DeleteProtobufMineGameSavInfo"))
{
string query = "delete from `user_gamesavedata` where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
@ -331,10 +323,6 @@ namespace AxibugEmuOnline.Server.Manager
bDone = command.ExecuteNonQuery() > 0;
}
}
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
return bDone;
}
}

View File

@ -87,6 +87,11 @@ namespace AxibugEmuOnline.Server
AppSrv.g_GameShareMgr.RecvGameMark(null, null);
}
break;
case "sql":
{
SQLRUN.GetPoolState();
}
break;
default:
Console.WriteLine("未知命令" + CommandStr);
break;
@ -98,7 +103,8 @@ namespace AxibugEmuOnline.Server
static void UpdateRomHash()
{
AppSrv.g_Log.Info("UpdateRomHash");
MySqlConnection conn = SQLPool.DequeueSQLConn("UpdateRomHash");
using (MySqlConnection conn = SQLRUN.GetConn("UpdateRomHash"))
{
try
{
List<(int id, string romurl, string name)> list = new List<(int id, string romurl, string name)>();
@ -149,7 +155,7 @@ namespace AxibugEmuOnline.Server
{
AppSrv.g_Log.Info($"err:{e.ToString()}");
}
SQLPool.EnqueueSQLConn(conn);
}
}
}
}

View File

@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<History>True|2025-01-09T06:39:17.5797829Z||;True|2025-01-09T14:39:05.6042660+08:00||;True|2025-01-09T14:33:09.1944386+08:00||;</History>
<History>True|2025-02-25T02:21:20.8779432Z||;False|2025-02-25T10:20:39.1249758+08:00||;False|2025-02-24T23:48:17.6638177+08:00||;True|2025-01-09T14:39:17.5797829+08:00||;True|2025-01-09T14:39:05.6042660+08:00||;True|2025-01-09T14:33:09.1944386+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<History>True|2025-01-13T08:07:43.4441316Z||;True|2025-01-09T15:02:05.2160606+08:00||;True|2025-01-09T14:48:42.5299550+08:00||;False|2025-01-09T14:48:02.6306184+08:00||;True|2025-01-09T14:17:00.2185117+08:00||;True|2025-01-08T23:13:47.7309044+08:00||;True|2025-01-08T13:32:52.0590130+08:00||;True|2025-01-08T13:31:56.8589678+08:00||;True|2025-01-07T13:54:02.0272718+08:00||;True|2025-01-07T10:47:36.6196477+08:00||;True|2025-01-07T01:21:34.5863249+08:00||;False|2025-01-07T01:20:39.5344134+08:00||;True|2025-01-07T00:21:47.4863058+08:00||;True|2025-01-07T00:16:42.7998249+08:00||;False|2025-01-07T00:16:02.8107509+08:00||;False|2025-01-02T15:36:18.1906464+08:00||;False|2025-01-02T15:36:06.5622643+08:00||;True|2024-12-27T18:24:49.7554320+08:00||;</History>
<History>True|2025-02-25T02:21:36.3766073Z||;True|2025-01-13T16:07:43.4441316+08:00||;True|2025-01-09T15:02:05.2160606+08:00||;True|2025-01-09T14:48:42.5299550+08:00||;False|2025-01-09T14:48:02.6306184+08:00||;True|2025-01-09T14:17:00.2185117+08:00||;True|2025-01-08T23:13:47.7309044+08:00||;True|2025-01-08T13:32:52.0590130+08:00||;True|2025-01-08T13:31:56.8589678+08:00||;True|2025-01-07T13:54:02.0272718+08:00||;True|2025-01-07T10:47:36.6196477+08:00||;True|2025-01-07T01:21:34.5863249+08:00||;False|2025-01-07T01:20:39.5344134+08:00||;True|2025-01-07T00:21:47.4863058+08:00||;True|2025-01-07T00:16:42.7998249+08:00||;False|2025-01-07T00:16:02.8107509+08:00||;False|2025-01-02T15:36:18.1906464+08:00||;False|2025-01-02T15:36:06.5622643+08:00||;True|2024-12-27T18:24:49.7554320+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -1,202 +0,0 @@
using Microsoft.Extensions.Logging;
using MySql.Data.MySqlClient;
namespace AxibugEmuOnline.Web.Common
{
public static class SQLPool
{
static Queue<MySqlConnection> _ConQueue = new Queue<MySqlConnection>();
static Dictionary<MySqlConnection, Haoyue_PoolTime> _OutOfSQLPool = new Dictionary<MySqlConnection, Haoyue_PoolTime>();
static Dictionary<string, long> _DicSqlRunFunNum = new Dictionary<string, long>();
static Dictionary<string, long> _DicTimeOutSqlRunFunNum = new Dictionary<string, long>();
const int DefaultCount = 1;
const int MaxLimit = 5;
static readonly object _sync = new object();
static MySqlConnectionStringBuilder connBuilder;
public static void InitConnMgr()
{
connBuilder = new MySqlConnectionStringBuilder();
connBuilder.Database = Config.cfg.DBName;
connBuilder.Server = Config.cfg.DBIp;
connBuilder.UserID = Config.cfg.DBUname;
connBuilder.Password = Config.cfg.DBPwd;
connBuilder.Port = Config.cfg.DBPort;
//connBuilder.MinimumPoolSize = 40u;
//connBuilder.MaximumPoolSize = 100u;
connBuilder.Pooling = true;
Console.WriteLine("SQLPool连接初始化....");
for (int i = 0; i < DefaultCount; i++)
{
MySqlConnection _conn = conn();
_conn.Open();
_ConQueue.Enqueue(_conn);
}
Console.WriteLine("SQLPool初始化完毕,连接数" + _ConQueue.Count);
}
public static MySqlConnection conn()
{
return new MySqlConnection(connBuilder.ConnectionString);
}
public static MySqlConnection DequeueSQLConn(string FuncStr)
{
lock (_sync)
{
if (_DicSqlRunFunNum.ContainsKey(FuncStr))
{
_DicSqlRunFunNum[FuncStr]++;
}
else
{
_DicSqlRunFunNum[FuncStr] = 1L;
}
MySqlConnection _conn = null;
if (_ConQueue.Count < 1)
{
Console.WriteLine("[DequeueSQLConn]创建新的SQLPool.Count>" + _ConQueue.Count);
_conn = conn();
_conn.Open();
}
else
{
MySqlConnection temp = null;
while (_ConQueue.Count > 0)
{
Console.WriteLine("[DequeueSQLConn]取出一个SQLCount.Count>" + _ConQueue.Count);
temp = _ConQueue.Dequeue();
if (temp.State == System.Data.ConnectionState.Closed)
{
Console.WriteLine("[DequeueSQLConn]已经断开SQLCount.Count>" + _ConQueue.Count);
temp.Dispose();
temp = null;
continue;
}
}
if (temp != null)
{
_conn = temp;
}
else
{
Console.WriteLine("[DequeueSQLConn]连接池全部已断开,重新创建连接");
_conn = conn();
_conn.Open();
}
}
_OutOfSQLPool.Add(_conn, new Haoyue_PoolTime
{
time = time(),
FuncStr = FuncStr
});
return _conn;
}
}
public static void EnqueueSQLConn(MySqlConnection BackConn)
{
lock (_sync)
{
if (_OutOfSQLPool.ContainsKey(BackConn))
{
_OutOfSQLPool.Remove(BackConn);
}
else
{
Console.WriteLine("出队遗漏的数据出现了!");
}
if (_ConQueue.Count > MaxLimit)
{
Console.WriteLine("已经不需要回收了,多余了,SQLPool.Count>" + _ConQueue.Count);
BackConn.Close();
BackConn.Dispose();
BackConn = null;
}
else
{
_ConQueue.Enqueue(BackConn);
Console.WriteLine("回收SQLPool.Count>" + _ConQueue.Count);
}
}
}
public static void CheckPoolTimeOut()
{
lock (_sync)
{
long now = time();
List<MySqlConnection> removeTemp = new List<MySqlConnection>();
foreach (KeyValuePair<MySqlConnection, Haoyue_PoolTime> o2 in _OutOfSQLPool)
{
if (now - o2.Value.time >= 120)
{
if (_DicTimeOutSqlRunFunNum.ContainsKey(o2.Value.FuncStr))
{
_DicTimeOutSqlRunFunNum[o2.Value.FuncStr]++;
}
else
{
_DicTimeOutSqlRunFunNum[o2.Value.FuncStr] = 1L;
}
if (_ConQueue.Count > MaxLimit)
{
Console.WriteLine("[超时回收]" + o2.Value.FuncStr + "已经不需要回收了,多余了,SQLPool.Count>" + _ConQueue.Count);
o2.Key.Close();
}
else
{
Console.WriteLine("[超时回收]" + o2.Value.FuncStr + "回收SQLPool.Count>" + _ConQueue.Count);
_ConQueue.Enqueue(o2.Key);
}
removeTemp.Add(o2.Key);
}
}
if (removeTemp.Count() <= 0)
{
return;
}
foreach (MySqlConnection o in removeTemp)
{
if (_OutOfSQLPool.ContainsKey(o))
{
_OutOfSQLPool.Remove(o);
Console.WriteLine("[超时回收]_OutOfSQLPool清理");
}
else
{
Console.WriteLine("[超时回收]_OutOfSQLPool清理异常");
}
}
Console.WriteLine("[超时回收]处理结束SQLPool.Count>" + _ConQueue.Count);
}
}
public static long time()
{
return Convert.ToInt64((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds);
}
public static void GetPoolState()
{
Console.WriteLine("-----------------查询统计-----------------");
foreach (KeyValuePair<string, long> dic2 in _DicSqlRunFunNum)
{
Console.WriteLine(dic2.Key + ":" + dic2.Value);
}
Console.WriteLine("-----------------超时统计-----------------");
foreach (KeyValuePair<string, long> dic in _DicTimeOutSqlRunFunNum)
{
Console.WriteLine(dic.Key + ":" + dic.Value);
}
Console.WriteLine("------------------------------------------");
}
}
public class Haoyue_PoolTime
{
public long time { get; set; }
public string FuncStr { get; set; }
}
}

View File

@ -0,0 +1,72 @@
using MySql.Data.MySqlClient;
namespace AxibugEmuOnline.Web.Common
{
public static class SQLRUN
{
// 移除自定义队列和状态跟踪字典
private static Dictionary<string, long> _DicSqlRunFunNum = new Dictionary<string, long>();
private static Dictionary<string, long> _DicTimeOutSqlRunFunNum = new Dictionary<string, long>();
const int DefaultCount = 1;
const int MaxLimit = 10;
static readonly object _sync = new object();
static MySqlConnectionStringBuilder connBuilder;
public static void InitConnMgr()
{
// 配置 MySQL 内置连接池
connBuilder = new MySqlConnectionStringBuilder
{
Database = Config.cfg.DBName,
Server = Config.cfg.DBIp,
UserID = Config.cfg.DBUname,
Password = Config.cfg.DBPwd,
Port = Config.cfg.DBPort,
Pooling = true, // 启用内置连接池
MinimumPoolSize = DefaultCount, // 最小连接数
MaximumPoolSize = MaxLimit // 最大连接数
};
// 初始化时不手动创建连接,依赖连接池自动管理
Console.WriteLine("SQLPool初始化完成连接池参数已配置");
}
public static MySqlConnection GetConn(string FuncStr)
{
lock (_sync)
{
IncrementFuncCall(FuncStr);
// 直接使用 MySQL 内置连接池获取连接
var conn = new MySqlConnection(connBuilder.ConnectionString);
conn.Open();
return conn;
}
}
public static void GetPoolState()
{
Console.WriteLine("-----------------查询统计-----------------");
foreach (var entry in _DicSqlRunFunNum)
{
Console.WriteLine($"函数 {entry.Key} 调用次数: {entry.Value}");
}
Console.WriteLine("-----------------超时统计-----------------");
foreach (var entry in _DicTimeOutSqlRunFunNum)
{
Console.WriteLine($"函数 {entry.Key} 超时次数: {entry.Value}");
}
Console.WriteLine("------------------------------------------");
}
#region
private static void IncrementFuncCall(string funcStr)
{
_DicSqlRunFunNum[funcStr] = _DicSqlRunFunNum.ContainsKey(funcStr) ? _DicSqlRunFunNum[funcStr] + 1 : 1;
}
#endregion
}
}

View File

@ -65,7 +65,7 @@ namespace AxibugEmuOnline.Web.Controllers
Resp_GameList resp = new Resp_GameList();
resp.gameList = new List<Resp_RomInfo>();
MySqlConnection conn = SQLPool.DequeueSQLConn("RomList");
using (MySqlConnection conn = SQLRUN.GetConn("RomList"))
{
List<string> condition = new List<string>();
@ -168,7 +168,6 @@ namespace AxibugEmuOnline.Web.Controllers
}
}
}
SQLPool.EnqueueSQLConn(conn);
}
return new JsonResult(resp);
}
@ -200,7 +199,7 @@ namespace AxibugEmuOnline.Web.Controllers
string searchPattern = $"%{SearchKey}%";
Resp_GameList resp = new Resp_GameList();
resp.gameList = new List<Resp_RomInfo>();
MySqlConnection conn = SQLPool.DequeueSQLConn("MarkList");
using (MySqlConnection conn = SQLRUN.GetConn("MarkList"))
{
string platformCond = "";
if (Ptype > (int)RomPlatformType.Invalid && Ptype < (int)RomPlatformType.All)
@ -297,7 +296,6 @@ LIMIT ?offset, ?pageSize;";
}
}
}
SQLPool.EnqueueSQLConn(conn);
}
return new JsonResult(resp);
}
@ -313,7 +311,7 @@ LIMIT ?offset, ?pageSize;";
string searchPattern = $"%{RomInfo}%";
Resp_RomInfo resp = new Resp_RomInfo();
MySqlConnection conn = SQLPool.DequeueSQLConn("NesRomList");
using (MySqlConnection conn = SQLRUN.GetConn("NesRomList"))
{
string query = $"SELECT id,`Name`,GameType,Note,RomUrl,ImgUrl,`Hash`,`playcount`,`stars`,`PlatformType`,`parentids` FROM romlist where id = ?romid;";
using (var command = new MySqlCommand(query, conn))
@ -347,7 +345,6 @@ LIMIT ?offset, ?pageSize;";
}
}
}
SQLPool.EnqueueSQLConn(conn);
}
if (UID > 0)
@ -385,7 +382,8 @@ LIMIT ?offset, ?pageSize;";
public bool CheckIsRomStar(int RomId, long uid)
{
bool bhad = false;
MySqlConnection conn = SQLPool.DequeueSQLConn("CheckIsRomStart");
using (MySqlConnection conn = SQLRUN.GetConn("CheckIsRomStart"))
{
try
{
string query = $"SELECT count(0) from rom_stars where uid = ?uid and romid = ?romid";
@ -402,7 +400,7 @@ LIMIT ?offset, ?pageSize;";
{
//AppSrv.g_Log.Error(e);
}
SQLPool.EnqueueSQLConn(conn);
}
return bhad;
}

View File

@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>G:\Sin365\AxibugEmuOnline\AxibugEmuOnline.Web\bin\Release\net8.0\publish\</_PublishTargetUrl>
<History>True|2025-02-05T03:59:16.6277678Z||;True|2025-02-05T11:57:28.8928988+08:00||;True|2025-01-23T14:10:54.0851574+08:00||;True|2025-01-23T13:21:13.2937446+08:00||;True|2025-01-23T13:15:40.1876887+08:00||;True|2025-01-13T15:57:42.8554189+08:00||;True|2025-01-13T15:56:16.9992929+08:00||;True|2025-01-09T15:00:13.8691822+08:00||;True|2025-01-09T14:47:16.4993283+08:00||;True|2025-01-09T14:47:09.3814423+08:00||;True|2025-01-09T14:38:36.2730244+08:00||;True|2025-01-08T13:35:26.6793825+08:00||;True|2025-01-07T10:37:18.6461694+08:00||;True|2024-09-12T14:18:38.6992653+08:00||;True|2024-09-12T14:08:58.4526827+08:00||;True|2024-08-22T14:13:06.3067002+08:00||;True|2024-08-14T10:33:10.9180984+08:00||;True|2024-08-13T18:28:27.5050523+08:00||;True|2024-08-13T18:25:47.6591234+08:00||;True|2024-08-13T18:25:17.5344107+08:00||;True|2024-08-13T17:46:23.4523329+08:00||;</History>
<History>True|2025-02-25T02:10:20.1998665Z||;True|2025-02-25T10:06:10.7381658+08:00||;True|2025-02-24T20:17:30.7705009+08:00||;True|2025-02-24T20:17:22.8138039+08:00||;True|2025-02-24T20:04:18.6428884+08:00||;True|2025-02-24T20:03:59.5011548+08:00||;True|2025-02-24T19:53:21.4793388+08:00||;True|2025-02-05T11:59:16.6277678+08:00||;True|2025-02-05T11:57:28.8928988+08:00||;True|2025-01-23T14:10:54.0851574+08:00||;True|2025-01-23T13:21:13.2937446+08:00||;True|2025-01-23T13:15:40.1876887+08:00||;True|2025-01-13T15:57:42.8554189+08:00||;True|2025-01-13T15:56:16.9992929+08:00||;True|2025-01-09T15:00:13.8691822+08:00||;True|2025-01-09T14:47:16.4993283+08:00||;True|2025-01-09T14:47:09.3814423+08:00||;True|2025-01-09T14:38:36.2730244+08:00||;True|2025-01-08T13:35:26.6793825+08:00||;True|2025-01-07T10:37:18.6461694+08:00||;True|2024-09-12T14:18:38.6992653+08:00||;True|2024-09-12T14:08:58.4526827+08:00||;True|2024-08-22T14:13:06.3067002+08:00||;True|2024-08-14T10:33:10.9180984+08:00||;True|2024-08-13T18:28:27.5050523+08:00||;True|2024-08-13T18:25:47.6591234+08:00||;True|2024-08-13T18:25:17.5344107+08:00||;True|2024-08-13T17:46:23.4523329+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>