C#+ MySQL连接

时间:2011-09-19 14:19:42

标签: c# mysql

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

这是一种好的做法,还是应该使用一个'全局'(静态?)连接?使用单个连接有点违背我构造代码的习惯。不是使用一个共享静态字段的100000个对象的忠实粉丝。我敢打赌这也反对大多数程序员的观点。

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

因此,简而言之,我想对如何组织我的MySQLConnections有一些看法。如果您认为所有程序类使用的单个静态MySQLConnection更好(不一定是性能方面,我更多地谈论多个MySQLConnections对数据库系统本身的影响),请让我知道您为什么这么认为

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

4 个答案:

答案 0 :(得分:2)

我的经验法则是:

  • 尽可能短暂地保持联系畅通无法
  • 让ADO.NET为您处理连接池
  • 仅在流程一起参与交易时才共享连接

所以,不,你不应该使用一个全局静态连接。但是,您可以使用实用方法为打开的连接提供数据提取方法。然后你会做类似的事情(假设Sql是你的实用程序类):

public IEnumerable<MyClass> GetSomeData()
{
    using (var cn = Sql.GetOpenConnection())
    {
        //get your data here
    }
}

答案 1 :(得分:0)

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

certurely让系统处理连接池。数据库连接很昂贵。

答案 2 :(得分:0)

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

每个类使用一个连接并且这是事务处理有一个缺点。无法通过多个连接共享事务(除非您使用TransactionScope)。

我通常更喜欢每个“会话”一个连接,并将构造函数中的连接接收到我的存储库类。 (因为我通常使用控制容器的反转)。谷歌有点关于工作单位的实施。

答案 3 :(得分:-1)

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);
        }
    }
}