C#和#x2B;MySQL连接

C#和#x2B;MySQL连接,c#,mysql,C#,Mysql,我目前正在从事一个C#(.NET)项目,该项目连接到MySQL社区服务器数据库并运行一些查询。目前有4个类使用自己的MySQLConnection对象(我使用的是MySQL.NET连接器)来连接数据库 这是一种良好的做法,还是应该使用一个“全局”(静态)连接?使用单个连接有点违背我构建代码的习惯。不太喜欢100000个对象在一个共享静态场中工作。我打赌这也违背了大多数程序员的观点 我还注意到,一旦调用connection.Close(),连接就不一定会关闭。再次尝试.Open()将导致异常。我相

我目前正在从事一个C#(.NET)项目,该项目连接到MySQL社区服务器数据库并运行一些查询。目前有4个类使用自己的MySQLConnection对象(我使用的是MySQL.NET连接器)来连接数据库

这是一种良好的做法,还是应该使用一个“全局”(静态)连接?使用单个连接有点违背我构建代码的习惯。不太喜欢100000个对象在一个共享静态场中工作。我打赌这也违背了大多数程序员的观点

我还注意到,一旦调用connection.Close(),连接就不一定会关闭。再次尝试.Open()将导致异常。我相信这是因为我没有在连接字符串中设置“Pooling=False”。我来试试看。如果你对这一点也有任何想法,请随意把它们放在这里

所以,简而言之,我想听听关于如何组织我的MySQL连接的一些意见。如果您认为所有程序类都使用一个静态MySQLConnection更好(不一定是性能方面的,我将更多地讨论多个MySQLConnection对数据库系统本身的影响),请告诉我您为什么这么认为

我预计最终的程序将有大约10或15个类,每个类都会主动查询数据库。

我的经验法则是:

  • 保持连接尽可能短的时间开放
  • 让ADO.NET为您处理连接池
  • 仅当流程一起参与事务时共享连接
所以,不应该使用一个全局静态连接。但是您可以有一个实用方法,为您的数据获取方法提供一个开放连接。然后您将执行以下操作(假设
Sql
是您的实用程序类):

public IEnumerable GetSomeData()
{
使用(var cn=Sql.GetOpenConnection())
{
//在这里获取您的数据
}
}

不要创建单个共享连接。尽可能晚开,早关。如果您需要为多个查询使用连接,请尝试查看MARS(多个活动记录集),但我不知道MySQL连接器是否支持该功能


一定要让系统处理连接池。数据库连接很昂贵。

您可以继续使用每个类一个连接。正如您所注意到的,大多数ADO.NET提供程序在默认情况下使用连接池
Close
不会真正关闭连接,而是将连接返回到池。但是,不应再次尝试
Open()
连接,而应创建一个新的连接对象

每个类使用一个连接有一个缺点,那就是事务处理。无法通过多个连接共享事务(除非您使用的是
TransactionScope


我通常希望每个“会话”有一个连接,并在构造函数中接受到我的存储库类的连接。(因为我通常使用控制容器的反转)。谷歌有一点关于工作单元的实现。

该死,我只能选择一个答案。虽然这三个都很棒。然后,每个类有一个连接。尽快关闭它,并在需要新连接时创建新对象。感谢您提供有关工作单位和火星的提示。
public class DALCommon
{
    public static string GetConnectionString
    {
        //return System.Configuration.ConfigurationManager.AppSettings["connectionInfo"];

        get
        {
            NameValueCollection appSettings = ConfigurationManager.AppSettings;
            string server = appSettings["server"];
            string userid = appSettings["userid"];
            string password = appSettings["password"];

            return String.Format("server={0};user id={1}; password={2}; database=dbmystock; pooling=false", server, userid, password);
        }
    }
}
public class DALCommon
{
    public static string GetConnectionString
    {
        //return System.Configuration.ConfigurationManager.AppSettings["connectionInfo"];

        get
        {
            NameValueCollection appSettings = ConfigurationManager.AppSettings;
            string server = appSettings["server"];
            string userid = appSettings["userid"];
            string password = appSettings["password"];

            return String.Format("server={0};user id={1}; password={2}; database=dbmystock; pooling=false", server, userid, password);
        }
    }
}