【发布时间】:2017-01-24 12:51:17
【问题描述】:
我想利用连接池,这样我就可以在不将 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 支持连接池,以提高数据库密集型应用程序的性能和可扩展性。这是默认启用的。您可以使用连接字符串选项 Pooling、Connection Reset、Connection Lifetime、Cache Server Properties、Max Pool Size 和 Min Pool Size 将其关闭或调整其性能特征。有关详细信息,请参阅第 5.2 节“创建连接器/网络连接字符串”。
连接池的工作原理是在客户端处理 MySqlConnection 时保持与服务器的本机连接。 随后,如果打开了一个新的 MySqlConnection 对象,它将从连接池中创建,而不是创建一个新的本机连接。这可以提高性能。
【问题讨论】:
-
你从来没有真正打开过连接,所以这并不奇怪。
-
conn.Open();在哪里?
标签: c# mysql-connector