我想利用连接池,所以我可以使用数据库而不将MysqlConnection对象传递给每个类。我有这样的代码:
Main.cs:
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应该从连接池获取连接。 但是一旦我运行我的程序,就会抛出带有
的System.InvalidOperationException其他信息:无法连接到任何指定的MySQL主机。
在:
cmd.Prepare();
现在,我认为我做错了什么,但我无法弄明白到底是什么。
Oracle文档说这个
Connector / Net支持连接池,以便在数据库密集型应用程序中获得更好的性能和可伸缩性。默认情况下启用此选项。您可以使用连接字符串选项池,连接重置,连接生命周期,缓存服务器属性,最大池大小和最小池大小来关闭它或调整其性能特征。有关详细信息,请参见第5.2节“创建连接器/网络连接字符串”。
当客户端处理MySqlConnection时,连接池的工作原理是保持与服务器的本机连接。 随后,如果打开一个新的MySqlConnection对象,它将从连接池创建,而不是创建新的本机连接。这样可以提高性能。
答案 0 :(得分:1)
好吧,似乎有两个不同的问题:
连接打开两次 - 第一次在Main方法中,第二次(独立地)在Monitor类中。这可以通过仅在监视器类中打开连接并在其中传递连接字符串来解决。
您从未通过调用.Open()
方法打开连接。
让我们重构您的代码,牢记这一点:
主要:
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();
//...
}
监控:
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();
...
}
}
}