【问题标题】:C# + MySQL ConnectionsC# + MySQL 连接
【发布时间】:2016-02-12 17:43:53
【问题描述】:

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

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

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

所以,简而言之,我想就如何组织我的 MySQLConnections 提出一些意见。如果您认为所有程序的类都使用单个静态 MySQLConnection 更好(不一定在性能方面,我更多地谈论多个 MySQLConnections 对数据库系统本身的影响),请告诉我您为什么这么认为.

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

【问题讨论】:

  • 该死,我只能选择一个答案。虽然这三个都很棒。然后每个班级一个连接。尽快关闭它,并在需要新连接时创建一个新对象。感谢您提供有关工作单元和 MARS 的提示。

标签: c# mysql


【解决方案1】:

我的经验法则是:

  • 尽可能短时间保持连接打开
  • 让 ADO.NET 为您处理连接池
  • 仅当进程一起参与事务时共享连接

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      当然让系统处理连接池。 db 连接很昂贵。

      【讨论】:

        【解决方案4】:
        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);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-03
          • 2014-11-08
          • 2011-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-22
          • 2014-06-23
          相关资源
          最近更新 更多