修为内置连接池

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,82 +21,83 @@ 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");
try
using (MySqlConnection conn = SQLRUN.GetConn("RecvGameMark"))
{
string query = "SELECT id from rom_stars where uid = ?uid and romid = ?romid";
bool bHad = false;
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
using (var reader = command.ExecuteReader())
string query = "SELECT id from rom_stars where uid = ?uid and romid = ?romid";
bool bHad = false;
using (var command = new MySqlCommand(query, conn))
{
while (reader.Read())
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
using (var reader = command.ExecuteReader())
{
bHad = true;
break;
while (reader.Read())
{
bHad = true;
break;
}
}
}
}
//收藏
if (msg.Motion == 1)
{
if (bHad)
//收藏
if (msg.Motion == 1)
{
AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdGameMark, (int)ErrorCode.ErrorRomAlreadyHadStar, ProtoBufHelper.Serizlize(respData));
return;
}
else
{
query = "INSERT INTO `haoyue_emu`.`rom_stars` (`uid`, `romid`) VALUES (?uid, ?romid);";
using (var command = new MySqlCommand(query, conn))
if (bHad)
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
command.ExecuteNonQuery();
AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdGameMark, (int)ErrorCode.ErrorRomAlreadyHadStar, ProtoBufHelper.Serizlize(respData));
return;
}
else
{
query = "INSERT INTO `haoyue_emu`.`rom_stars` (`uid`, `romid`) VALUES (?uid, ?romid);";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
command.ExecuteNonQuery();
}
}
}
}
else//取消收藏
{
if (bHad)
else//取消收藏
{
query = "DELETE from rom_stars where uid = ?uid and romid = ?romid";
using (var command = new MySqlCommand(query, conn))
if (bHad)
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
command.ExecuteNonQuery();
query = "DELETE from rom_stars where uid = ?uid and romid = ?romid";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
command.ExecuteNonQuery();
}
}
else
{
AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdGameMark, (int)ErrorCode.ErrorRomDontHadStar, ProtoBufHelper.Serizlize(respData));
return;
}
}
else
//更新收藏数
query = "update romlist set stars = (SELECT COUNT(id) from rom_stars where rom_stars.romid = ?romid) where romlist.id = ?romid";
using (var command = new MySqlCommand(query, conn))
{
AppSrv.g_ClientMgr.ClientSend(_c, (int)CommandID.CmdGameMark, (int)ErrorCode.ErrorRomDontHadStar, ProtoBufHelper.Serizlize(respData));
return;
command.Parameters.AddWithValue("?romid", msg.RomID);
command.ExecuteNonQuery();
}
}
//更新收藏数
query = "update romlist set stars = (SELECT COUNT(id) from rom_stars where rom_stars.romid = ?romid) where romlist.id = ?romid";
using (var command = new MySqlCommand(query, conn))
{
command.Parameters.AddWithValue("?romid", msg.RomID);
command.ExecuteNonQuery();
}
}
catch (Exception e)
{
}
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,59 +105,61 @@ namespace AxibugEmuOnline.Server.Manager
public int GetRomStart(int RomId)
{
int stars = 0;
MySqlConnection conn = SQLPool.DequeueSQLConn("GetStart");
try
using (MySqlConnection conn = SQLRUN.GetConn("GetStart"))
{
string query = $"SELECT `stars` FROM romlist where id = ?romid;";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?RomID", RomId);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
string query = $"SELECT `stars` FROM romlist where id = ?romid;";
using (var command = new MySqlCommand(query, conn))
{
while (reader.Read())
// 设置参数值
command.Parameters.AddWithValue("?RomID", RomId);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
stars = reader.GetInt32(0);
while (reader.Read())
{
stars = reader.GetInt32(0);
}
}
}
}
catch (Exception e)
{
AppSrv.g_Log.Error(e);
}
}
catch (Exception e)
{
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");
try
using (MySqlConnection conn = SQLRUN.GetConn("CheckIsRomStart"))
{
string query = $"SELECT count(id) from rom_stars where uid = ?uid and romid = ?romid";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?romid", RomId);
command.Parameters.AddWithValue("?uid", uid);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
string query = $"SELECT count(id) from rom_stars where uid = ?uid and romid = ?romid";
using (var command = new MySqlCommand(query, conn))
{
while (reader.Read())
// 设置参数值
command.Parameters.AddWithValue("?romid", RomId);
command.Parameters.AddWithValue("?uid", uid);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
bhad = reader.GetInt32(0) > 0;
while (reader.Read())
{
bhad = reader.GetInt32(0) > 0;
}
}
}
}
catch (Exception e)
{
AppSrv.g_Log.Error("CheckIsRomStar" + e);
}
}
catch (Exception 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,25 +79,26 @@ 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");
try
using (MySqlConnection conn = SQLRUN.GetConn("ModifyNikeName"))
{
string query = "update users set nikename = ?nikename where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?nikename", msg.NickName);
if (command.ExecuteNonQuery() > 0)
string query = "update users set nikename = ?nikename where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
{
bDone = true;
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?nikename", msg.NickName);
if (command.ExecuteNonQuery() > 0)
{
bDone = true;
}
}
}
catch (Exception e)
{
}
}
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
if (bDone)
{
@ -132,34 +133,15 @@ namespace AxibugEmuOnline.Server.Manager
{
uid = 0;
bool bDone = true;
MySqlConnection conn = SQLPool.DequeueSQLConn("GetUidByDevice");
try
using (MySqlConnection conn = SQLRUN.GetConn("GetUidByDevice"))
{
string query = "SELECT uid from user_devices where device = ?deviceStr ";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?deviceStr", deviceStr);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
uid = reader.GetInt64(0);
}
}
}
if (uid > 0)
{
AppSrv.g_Log.Info($"设备串:{deviceStr} 对应 UID:{uid}");
}
else
{
query = "INSERT INTO `haoyue_emu`.`users` (`nikename`, `regdate`,`lastlogindate`) VALUES (NULL,now(),now());SELECT LAST_INSERT_ID(); ";
string query = "SELECT uid from user_devices where device = ?deviceStr ";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
command.Parameters.AddWithValue("?deviceStr", deviceStr);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
@ -170,39 +152,59 @@ namespace AxibugEmuOnline.Server.Manager
}
}
//设置默认名字
query = "update users set nikename = ?nikename where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
if (uid > 0)
{
// 设置参数值
command.Parameters.AddWithValue("?uid", uid);
command.Parameters.AddWithValue("?nikename", GetRandomNickName(uid));
if (command.ExecuteNonQuery() < 1)
AppSrv.g_Log.Info($"设备串:{deviceStr} 对应 UID:{uid}");
}
else
{
query = "INSERT INTO `haoyue_emu`.`users` (`nikename`, `regdate`,`lastlogindate`) VALUES (NULL,now(),now());SELECT LAST_INSERT_ID(); ";
using (var command = new MySqlCommand(query, conn))
{
bDone = false;
// 设置参数值
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
uid = reader.GetInt64(0);
}
}
}
//设置默认名字
query = "update users set nikename = ?nikename where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
command.Parameters.AddWithValue("?uid", uid);
command.Parameters.AddWithValue("?nikename", GetRandomNickName(uid));
if (command.ExecuteNonQuery() < 1)
{
bDone = false;
}
}
query = "INSERT INTO `haoyue_emu`.`user_devices` (`device`, `devicetype`, `uid`) VALUES (?deviceStr, ?DeviceType, ?uid);";
using (var command = new MySqlCommand(query, conn))
{
command.Parameters.AddWithValue("?deviceStr", deviceStr);
command.Parameters.AddWithValue("?DeviceType", (int)DeviceType);
command.Parameters.AddWithValue("?uid", uid);
if (command.ExecuteNonQuery() < 1)
bDone = false;
}
AppSrv.g_Log.Info($"创建新账户,设备:{deviceStr},设备类型:{DeviceType.ToString()},是否成功:{bDone}");
}
query = "INSERT INTO `haoyue_emu`.`user_devices` (`device`, `devicetype`, `uid`) VALUES (?deviceStr, ?DeviceType, ?uid);";
using (var command = new MySqlCommand(query, conn))
{
command.Parameters.AddWithValue("?deviceStr", deviceStr);
command.Parameters.AddWithValue("?DeviceType", (int)DeviceType);
command.Parameters.AddWithValue("?uid", uid);
if (command.ExecuteNonQuery() < 1)
bDone = false;
}
AppSrv.g_Log.Info($"创建新账户,设备:{deviceStr},设备类型:{DeviceType.ToString()},是否成功:{bDone}");
}
catch (Exception e)
{
AppSrv.g_Log.Error($"ex=>{e.ToString()}");
bDone = false;
}
}
catch (Exception e)
{
AppSrv.g_Log.Error($"ex=>{e.ToString()}");
bDone = false;
}
SQLPool.EnqueueSQLConn(conn);
if (uid <= 0)
bDone = false;
@ -211,41 +213,42 @@ namespace AxibugEmuOnline.Server.Manager
public void UpdateUserData(long uid, ClientInfo _c, DeviceType deviceType)
{
MySqlConnection conn = SQLPool.DequeueSQLConn("UpdateUserData");
try
using (MySqlConnection conn = SQLRUN.GetConn("UpdateUserData"))
{
string query = "SELECT account,nikename,regdate,lastlogindate from users where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?uid", uid);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
string query = "SELECT account,nikename,regdate,lastlogindate from users where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
{
while (reader.Read())
// 设置参数值
command.Parameters.AddWithValue("?uid", uid);
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
_c.Account = reader.IsDBNull(0) ? string.Empty : reader.GetString(0);
_c.NickName = reader.IsDBNull(1) ? string.Empty : reader.GetString(1);
_c.LogInDT = DateTime.Now;
_c.RegisterDT = reader.IsDBNull(2) ? DateTime.Now : reader.GetDateTime(2);
_c.LastLogInDT = reader.IsDBNull(3) ? DateTime.Now : reader.GetDateTime(3);
_c.deviceType = deviceType;
_c.Account = reader.IsDBNull(0) ? string.Empty : reader.GetString(0);
_c.NickName = reader.IsDBNull(1) ? string.Empty : reader.GetString(1);
_c.LogInDT = DateTime.Now;
_c.RegisterDT = reader.IsDBNull(2) ? DateTime.Now : reader.GetDateTime(2);
_c.LastLogInDT = reader.IsDBNull(3) ? DateTime.Now : reader.GetDateTime(3);
_c.deviceType = deviceType;
}
}
}
query = "update users set lastlogindate = now() where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
{
command.Parameters.AddWithValue("?uid", uid);
command.ExecuteNonQuery();
}
}
query = "update users set lastlogindate = now() where uid = ?uid ";
using (var command = new MySqlCommand(query, conn))
catch (Exception e)
{
command.Parameters.AddWithValue("?uid", uid);
command.ExecuteNonQuery();
}
}
catch (Exception e)
{
}
SQLPool.EnqueueSQLConn(conn);
}
static string GenToken(ClientInfo _c)

View File

@ -109,10 +109,9 @@ namespace AxibugEmuOnline.Server
}
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"))
{
string query = "INSERT INTO `haoyue_emu`.`room_log` (`uid`, `platform`, `romid`,`roomid`, `state`) VALUES ( ?uid, ?platform, ?romid, ?roomid, ?state);";
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;
//加入
@ -844,7 +839,7 @@ namespace AxibugEmuOnline.Server
}
break;
}
}
/// <summary>
/// 更新同步名单
@ -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"))
{
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 (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"))
{
string query = "SELECT `savUrl`,`savImgUrl`, `savDate` from user_gamesavedata where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
@ -98,44 +93,40 @@ namespace AxibugEmuOnline.Server.Manager
}
}
}
}
catch (Exception e)
{
}
if (!bHad)
{
errCode = ErrorCode.ErrorRomDontHadSavedata;
}
else
{
bool bDelSav = FileDelete(Path.Combine(Config.cfg.savDataPath, SavUrl));
bool bDelImg = FileDelete(Path.Combine(Config.cfg.savDataPath, SavImgUrl));
if (!bDelSav || !bDelImg)
if (!bHad)
{
errCode = ErrorCode.ErrorRomDontHadSavedata;
}
else
{
try
bool bDelSav = FileDelete(Path.Combine(Config.cfg.savDataPath, SavUrl));
bool bDelImg = FileDelete(Path.Combine(Config.cfg.savDataPath, SavImgUrl));
if (!bDelSav || !bDelImg)
{
string query = "delete from user_gamesavedata where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
errCode = ErrorCode.ErrorRomDontHadSavedata;
}
else
{
try
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
if (command.ExecuteNonQuery() < 1)
query = "delete from user_gamesavedata where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
{
AppSrv.g_Log.Error("删除即时存档,但是他并没有.");
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
if (command.ExecuteNonQuery() < 1)
{
AppSrv.g_Log.Error("删除即时存档,但是他并没有.");
}
}
}
catch { }
}
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,25 +180,27 @@ namespace AxibugEmuOnline.Server.Manager
" ( `uid`, `romid`, `savidx`, `savName`, `savNote`, `savUrl`, `savImgUrl`, `savDate`)" +
" VALUES ( ?uid, ?romid, ?savidx, ?savName, ?savNote, ?savUrl, ?savImgUrl, ?savDate);";
using (var command = new MySqlCommand(query, conn))
using (MySqlConnection conn = SQLRUN.GetConn("RecvUpLoadGameSav"))
{
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
command.Parameters.AddWithValue("?savidx", msg.SavDataIdx);
command.Parameters.AddWithValue("?savName", msg.Name);
command.Parameters.AddWithValue("?savNote", msg.Note);
command.Parameters.AddWithValue("?savUrl", rompath);
command.Parameters.AddWithValue("?savImgUrl", imgpath);
command.Parameters.AddWithValue("?savDate", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
if (command.ExecuteNonQuery() < 1)
using (var command = new MySqlCommand(query, conn))
{
AppSrv.g_Log.Error("执行即时存档保存失败");
// 设置参数值
command.Parameters.AddWithValue("?uid", _c.UID);
command.Parameters.AddWithValue("?romid", msg.RomID);
command.Parameters.AddWithValue("?savidx", msg.SavDataIdx);
command.Parameters.AddWithValue("?savName", msg.Name);
command.Parameters.AddWithValue("?savNote", msg.Note);
command.Parameters.AddWithValue("?savUrl", rompath);
command.Parameters.AddWithValue("?savImgUrl", imgpath);
command.Parameters.AddWithValue("?savDate", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
if (command.ExecuteNonQuery() < 1)
{
AppSrv.g_Log.Error("执行即时存档保存失败");
}
}
}
}
SQLPool.EnqueueSQLConn(conn);
}
@ -273,44 +265,45 @@ namespace AxibugEmuOnline.Server.Manager
bool bhad = false;
protoData = default;
RomPlatformType ptype = AppSrv.g_GameShareMgr.GetRomPlatformType(romid);
MySqlConnection conn = SQLPool.DequeueSQLConn("GetProtobufMineGameSavInfo");
try
using (MySqlConnection conn = SQLRUN.GetConn("GetProtobufMineGameSavInfo"))
{
string query = "SELECT `id`,`uid`, `romid`, `savidx`, `savName`, `savNote`, `savUrl`, `savImgUrl`, `savDate` from `user_gamesavedata` where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?uid", uid);
command.Parameters.AddWithValue("?romid", romid);
command.Parameters.AddWithValue("?savidx", savIdx);
using (var reader = command.ExecuteReader())
string query = "SELECT `id`,`uid`, `romid`, `savidx`, `savName`, `savNote`, `savUrl`, `savImgUrl`, `savDate` from `user_gamesavedata` where uid = ?uid and romid = ?romid and savidx = ?savidx";
using (var command = new MySqlCommand(query, conn))
{
while (reader.Read())
// 设置参数值
command.Parameters.AddWithValue("?uid", uid);
command.Parameters.AddWithValue("?romid", romid);
command.Parameters.AddWithValue("?savidx", savIdx);
using (var reader = command.ExecuteReader())
{
protoData = new Protobuf_Mine_GameSavInfo()
while (reader.Read())
{
BHadSaveData = true,
SavID = reader.GetInt64(0),
Uid = reader.GetInt64(1),
RomID = reader.GetInt32(2),
SavDataIdx = reader.GetInt32(3),
SavName = reader.GetString(4),
Note = reader.GetString(5),
SavUrl = reader.GetString(6),
SavImgUrl = reader.GetString(7),
SavDate = reader.GetDateTime(8).ToString("yyyy-MM-dd HH:mm:ss"),
GamePlatformType = ptype
};
bhad = true;
break;
protoData = new Protobuf_Mine_GameSavInfo()
{
BHadSaveData = true,
SavID = reader.GetInt64(0),
Uid = reader.GetInt64(1),
RomID = reader.GetInt32(2),
SavDataIdx = reader.GetInt32(3),
SavName = reader.GetString(4),
Note = reader.GetString(5),
SavUrl = reader.GetString(6),
SavImgUrl = reader.GetString(7),
SavDate = reader.GetDateTime(8).ToString("yyyy-MM-dd HH:mm:ss"),
GamePlatformType = ptype
};
bhad = true;
break;
}
}
}
}
catch (Exception e)
{
}
}
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,58 +103,59 @@ namespace AxibugEmuOnline.Server
static void UpdateRomHash()
{
AppSrv.g_Log.Info("UpdateRomHash");
MySqlConnection conn = SQLPool.DequeueSQLConn("UpdateRomHash");
try
using (MySqlConnection conn = SQLRUN.GetConn("UpdateRomHash"))
{
List<(int id, string romurl, string name)> list = new List<(int id, string romurl, string name)>();
List<(int id, string romurl, string name)> Nonelist = new List<(int id, string romurl, string name)>();
string query = $"SELECT id,`Name`,GameType,Note,RomUrl,ImgUrl,`Hash` FROM romlist";
using (var command = new MySqlCommand(query, conn))
try
{
// 执行查询并处理结果
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
list.Add(
(reader.GetInt32(0),
!reader.IsDBNull(4) ? reader.GetString(4) : string.Empty,
!reader.IsDBNull(1) ? reader.GetString(1) : string.Empty
));
}
}
}
List<(int id, string romurl, string name)> list = new List<(int id, string romurl, string name)>();
List<(int id, string romurl, string name)> Nonelist = new List<(int id, string romurl, string name)>();
for (int i = 0; i < list.Count; i++)
{
string rompath = Config.cfg.RomDir + "/" + list[i].romurl;
rompath = System.Net.WebUtility.UrlDecode(rompath);
if (!File.Exists(rompath))
{
Nonelist.Add(list[i]);
continue;
}
string romhash = Helper.FileMD5Hash(rompath);
AppSrv.g_Log.Info($"第{i}个Name->{list[i].name},Hash->{romhash}");
query = $"update romlist SET `Hash` = '{romhash}' where Id ={list[i].id}";
string query = $"SELECT id,`Name`,GameType,Note,RomUrl,ImgUrl,`Hash` FROM romlist";
using (var command = new MySqlCommand(query, conn))
{
// 执行查询并处理结果
int reader = command.ExecuteNonQuery();
if (reader > 0)
AppSrv.g_Log.Info($"第{i}个,处理成功");
else
AppSrv.g_Log.Info($"第{i}个,处理失败");
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
list.Add(
(reader.GetInt32(0),
!reader.IsDBNull(4) ? reader.GetString(4) : string.Empty,
!reader.IsDBNull(1) ? reader.GetString(1) : string.Empty
));
}
}
}
for (int i = 0; i < list.Count; i++)
{
string rompath = Config.cfg.RomDir + "/" + list[i].romurl;
rompath = System.Net.WebUtility.UrlDecode(rompath);
if (!File.Exists(rompath))
{
Nonelist.Add(list[i]);
continue;
}
string romhash = Helper.FileMD5Hash(rompath);
AppSrv.g_Log.Info($"第{i}个Name->{list[i].name},Hash->{romhash}");
query = $"update romlist SET `Hash` = '{romhash}' where Id ={list[i].id}";
using (var command = new MySqlCommand(query, conn))
{
// 执行查询并处理结果
int reader = command.ExecuteNonQuery();
if (reader > 0)
AppSrv.g_Log.Info($"第{i}个,处理成功");
else
AppSrv.g_Log.Info($"第{i}个,处理失败");
}
}
AppSrv.g_Log.Info($"处理完毕,共{Nonelist.Count}个文件没有找到");
}
catch (Exception e)
{
AppSrv.g_Log.Info($"err:{e.ToString()}");
}
AppSrv.g_Log.Info($"处理完毕,共{Nonelist.Count}个文件没有找到");
}
catch (Exception e)
{
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,24 +382,25 @@ LIMIT ?offset, ?pageSize;";
public bool CheckIsRomStar(int RomId, long uid)
{
bool bhad = false;
MySqlConnection conn = SQLPool.DequeueSQLConn("CheckIsRomStart");
try
using (MySqlConnection conn = SQLRUN.GetConn("CheckIsRomStart"))
{
string query = $"SELECT count(0) from rom_stars where uid = ?uid and romid = ?romid";
using (var command = new MySqlCommand(query, conn))
try
{
// 设置参数值
command.Parameters.AddWithValue("?romid", RomId);
command.Parameters.AddWithValue("?uid", uid);
// 执行查询并获取结果
bhad = (int)command.ExecuteScalar() > 0;
string query = $"SELECT count(0) from rom_stars where uid = ?uid and romid = ?romid";
using (var command = new MySqlCommand(query, conn))
{
// 设置参数值
command.Parameters.AddWithValue("?romid", RomId);
command.Parameters.AddWithValue("?uid", uid);
// 执行查询并获取结果
bhad = (int)command.ExecuteScalar() > 0;
}
}
catch (Exception e)
{
//AppSrv.g_Log.Error(e);
}
}
catch (Exception e)
{
//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>