c# MySQL连接器:连接池不工作
本文关键字:工作 连接 MySQL 连接器 | 更新日期: 2023-09-27 18:07:11
我想利用连接池,这样我就可以使用数据库,而不需要将MysqlConnection对象传递给每个类。我有一个这样的代码:
c:
namespace batman
{
class Program
{
static void Main(string[] args)
{
using (MysqlConnection conn = new MysqlConnection("Server=localhost;User=root;Database=test;Password=root;Min Pool Size=3;Max Pool Size=5;Pooling=True"))
{
MonitorClass monitor = new MonitorClass();
monitor.Run();
}
//...
}
}
}
MonitorClass.cs:
namespace batman
{
public class MonitorClass
{
public void Run()
{
using (MySqlConnection conn = new MySqlConnection())
using (MySqlCommand cmd = conn.CreateCommand())
{
try
{
conn.Open();
cmd.CommandText = "SELECT id, package_type FROM package_registry WHERE finish_time <= @ftime";
cmd.Parameters.AddWithValue("@ftime", 0);
cmd.Prepare();
MySqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
int packageId = reader.GetInt32(0);
string packageType = reader.GetString(1);
Unirest.post("http://localhost/gears/ops/packagefinish")
.field("package", packageId)
.asStringAsync();
Console.WriteLine("[PackageMonitor] Package {0} ({1}) expired", packageId, packageType);
}
}
catch (MySqlException ex)
{
}
}
}
}
}
MonitorClass应该从连接池中获取连接。但是,一旦我运行我的程序,它抛出系统。InvalidOperationException
在:附加信息:无法连接到任何指定的MySQL主机。
cmd.Prepare ();
现在,我想我做错了什么,但我不知道到底是什么。
Oracle文档说这个
Connector/Net支持连接池,以便在数据库密集型应用程序中获得更好的性能和可伸缩性。这是默认启用的。您可以关闭它或使用连接字符串选项池,连接重置,连接寿命,缓存服务器属性,最大池大小和最小池大小调整其性能特征。有关详细信息,请参见第5.2节,"创建连接器/网络连接字符串"。连接池的工作原理是,当客户端处理MySqlConnection时,保持与服务器的本地连接处于活动状态。随后,如果打开一个新的MySqlConnection对象,它将从连接池中创建,而不是创建一个新的本机连接。这可以提高性能。
嗯,似乎有两个不同的问题:
-
连接打开两次-第一次在Main方法中,第二次(独立地)在Monitor类中。这可以通过只在monitor类中打开连接并在其中传递连接字符串来修复。
-
您没有通过调用
.Open()
方法打开连接。
让我们在记住这一点的情况下重构你的代码:
Main:
static void Main(string[] args)
{
var connStr = "Server=localhost;User=root;Database=test;Password=root;Min Pool Size=3;Max Pool Size=5;Pooling=True";
MonitorClass monitor = new MonitorClass(connStr);
monitor.Run();
//...
}
Monitor:
public class MonitorClass
{
private readonly string _connStr;
public MonitorClass(string connectionString)
{
this._connStr = connectionString;
}
public void Run()
{
using (MySqlConnection conn = new MySqlConnection(_connStr))
using (MySqlCommand cmd = conn.CreateCommand())
{
conn.Open();
...
}
}
}