gpt4 book ai didi

c# - 多线程时是否必须锁定数据库连接?

转载 作者:行者123 更新时间:2023-11-29 01:46:04 24 4
gpt4 key购买 nike

这是我目前用于数据库交互的类的示例:

using System;
using System.Data;
using System.Collections.Generic;

// Libraries
using log4net;
using log4net.Config;
using MySql.Data.MySqlClient;

namespace AIC
{
class DB
{
private static readonly ILog _logger = LogManager.GetLogger(typeof(DB));
private MySqlConnection _connection;
private MySqlCommand _cmd;
private string _server;
private string _database;
private string _username;
private string _password;

//Constructor
public DB(string server, string database, string username, string password)
{
log4net.Config.XmlConfigurator.Configure();

_server = server;
_database = database;
_username = username;
_password = password;

_connection = new MySqlConnection(string.Format("SERVER={0};DATABASE={1};UID={2};PASSWORD={3};charset=utf8;", _server, _database, _username, _password));
}

public bool TestConnection()
{
try
{
_connection.Open();
_connection.Close();
_logger.Info("Connection test, passed...");
return true;
}
catch (MySqlException ex)
{
_logger.Error(ex.ToString());
return false;
}
}

//open connection to database
private bool Open()
{
try
{
if (_connection.State != ConnectionState.Open)
_connection.Open();
_logger.Info("Starting connection to database...");
return true;
}
catch (MySqlException ex)
{
_logger.Error(ex.ToString());
return false;
}
}

//Close connection
private bool Close()
{
try
{
if (_connection.State != ConnectionState.Closed)
_connection.Close();
_logger.Info("Closing connection to database...");
return true;
}
catch (MySqlException ex)
{
_logger.Error(ex.ToString());
return false;
}
}

// Some basic functions
public bool UserExist(string user)
{
string query = "SELECT user_id FROM users WHERE username=@name LIMIT 1";
if (this.Open())
{
try
{
// Assign the connection
_cmd = new MySqlCommand(query, _connection);

// Prepare to receive params
_cmd.Prepare();

// Fill up the params
_cmd.Parameters.AddWithValue("@name", user);

// returned count bool
bool result = Convert.ToInt32(_cmd.ExecuteScalar()) > 0;

// Close connection
this.Close();
return result;
}
catch (MySqlException ex)
{
_logger.Error(ex.ToString());
this.Close();
return false;
}
}
else
{
_logger.Error("You must be connected to the database before performing this action");
return false;
}
}

public bool AddUser(string user)
{
// .... add user to database
}

public bool DelUser(string user)
{
// .... del user from database
}

public int CountUsers()
{
// .... count total users from database
}
}
}

目前,我没有任何打开和关闭连接的管理,所以它总是检查数据库是否连接,执行操作并关闭它如 UserExist 函数所示 .

考虑到这一点,我注意到我可能会在中间关闭我自己的连接或他们的交易,因为我在 2 个不同的线程中使用它。

我怀疑这个简单的类是否会出于任何原因锁定我的应用程序使其无响应或从长远来看给我带来任何麻烦?

我应该考虑、改进等什么?

将不胜感激代码示例。

最佳答案

每个线程都应该有自己的连接实例,在您的情况下可能是 Db 的实例。

但是如果完全不在 Db 对象中存储连接,问题会(大大)得到解决。最好的模式是仅将连接用作 using() {} 语句中的局部变量。

目前,您的类应该实现 IDisposable(仅针对 try/catch 逻辑失败的情况)。

关于c# - 多线程时是否必须锁定数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6556058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com