【问题标题】:MySql connection, can I leave it open?MySql 连接,我可以让它保持打开状态吗?
【发布时间】:2010-12-15 00:30:45
【问题描述】:

在整个会话期间保持连接打开是否明智? 我制作了一个连接到 MySql 数据库的 C# 应用程序,程序对其进行读写,并且该应用程序必须每天不间断地运行大约 10 个小时。

保持连接打开而不是每次从数据库中提取某些内容并在需要新内容时再次打开它时调用 close() 函数是否存在任何风险?

【问题讨论】:

    标签: c# mysql connection


    【解决方案1】:

    如果应用程序正在使用连接,则没有理由关闭它。如果您不需要连接,则应关闭它。如果您要让多个应用程序连接到数据库,那么您与该数据库的连接数是固定的。这就是为什么最好在完成后关闭并在需要时重新打开。

    【讨论】:

      【解决方案2】:

      让连接打开一段时间是可以的,只要:

      1. 您的并发空闲连接数没有达到 MySQL 连接限制;

      2. 您不会在不做任何事情的情况下将其打开小时。默认 MySQL 连接wait_timeout 为 8 小时;让连接长时间处于非活动状态,当您下次使用它时,您会收到“MySQL 服务器已消失”错误。

      【讨论】:

      • 保持连接打开并没有什么好处(假设提供者使用连接池)。官方 MySQL Connector/Net 提供程序默认使用连接池。 OP 没有提到他们实际使用的是哪个提供者,但如果它确实支持池化,那么我将使用打开延迟/关闭早期策略并让提供者管理底层物理连接。
      • 很抱歉为旧线程添加评论。我读过download.oracle.com/javadb/10.3.3.0/devguide/…,似乎只要您的应用程序有多个线程/事务,将每个线程分配给不同的连接是一个好习惯。谢谢。
      【解决方案3】:

      从安全的角度来看,我会说最好在查询后关闭它,以确保没有其他程序可以将它自己的东西注入打开的连接中。

      考虑到性能,显然最好始终打开连接。

      你的选择^^

      【讨论】:

        【解决方案4】:

        由于您使用的是 ADO.NET,因此您可以使用 ADO.NET 的内置连接池功能。实际上,让我细化一下:您必须始终使用 ADO.NET 的内置连接池功能。通过这样做,您将获得 .NET 运行时在后台透明地为您管理连接。即使您关闭它们,它也会使连接保持打开一段时间,并在您打开新连接时重新使用它们。这是非常快的东西。

        确保在您的连接字符串中提及您想要池连接,因为它可能不是默认行为。

        您只需要在需要时在本地创建连接,因为它们被汇集在后台,因此创建新连接没有开销:

        using (var connection = SomeMethodThatCreatesAConnectionObject())
        {
            // do your stuff here
            connection.Close(); // this is not necessary as
                                // Dispose() closes it anyway
                                // but still nice to do.
        }
        

        这就是你在 .NET 中应该这样做的方式。

        【讨论】:

          【解决方案5】:

          不,我看不出有什么理由不打开连接并重新使用它:毕竟,这是各种连接池技术背后的全部意义(尽管这些通常是为工作都在同一个数据源上运行的多线程情况。

          但是,要通过 bobince 扩展答案, - 只是因为您没有关闭连接,不要假设其他事情不会:连接可能超时,可能存在连接问题或一百零一个您的连接断开的原因。您需要假设连接可能不存在,并为此异常情况的代码添加逻辑。

          【讨论】:

            【解决方案6】:

            在我看来,保持连接打开并不是一个好习惯。 每次关闭连接的另一个方面是可扩展性。现在将其保持打开状态可能会很好,但如果您的应用程序的用户数量是两倍 3 倍怎么办。返回并更改所有代码是一件令人头疼的事情。 (我知道我已经做到了:-)

            【讨论】:

              【解决方案7】:

              如果您在代码中使用连接池,您的问题将得到解决。您不需要打开和关闭连接,因此您可以节省打开连接时使用的宝贵资源。您只需将连接返回到一个池,当请求连接时返回一个空闲连接。

              当然我的意见是,获取一个连接实例,使用它,提交/回滚你的工作并将其返回到池中。我不建议长时间保持连接打开。

              【讨论】:

                【解决方案8】:

                我在其他答案中没有看到的一件事:如果您准备了语句或临时表,它们可能会阻塞服务器资源,直到连接关闭。但另一方面,将连接保持一段时间而不是每隔一段时间重新创建它们会很有用。

                【讨论】:

                  【解决方案9】:

                  如果您不断打开和关闭连接,您将付出性能损失。如果您担心应用的太多运行副本会占用太多数据库连接,那么使用连接池和简短的 wait_timeout 可能是明智的。

                  【讨论】:

                  • 情况并非如此,这是唯一正在运行的应用程序,其他任何东西都不应尝试连接。
                  • 在这种情况下,我没有听说过您想要断开连接的原因。如果您的应用程序可以自动且透明地重新建立连接,那么它不会为您提供任何额外的安全性(实际上您会丢失一些安全性,因为每次身份验证都会暴露一点点信息)。事实上,称为连接池的流行内置功能会导致连接保持打开状态,即使您告诉代码关闭它,这样连接就可以被另一个进程重用,而不会产生身份验证的开销。
                  • 所以连接打开时会自动重新建立连接?还是我必须编写自己的代码来检测?
                  【解决方案10】:

                  可以,前提是:

                  • 如果断开连接,您将重新连接
                  • 如果发生异常情况,您可以重置连接状态
                  • 您将检测连接是否“安静”,例如是否发生防火墙超时

                  基本上,它需要大量关注故障情况并正确恢复;经常连接和断开连接要容易得多。

                  【讨论】:

                    【解决方案11】:

                    我觉得,如果有连接池机制,最好关闭连接。

                    其中一个原因是您不需要重新检查您的连接是否仍然存在。

                    【讨论】:

                      猜你喜欢
                      • 2012-01-25
                      • 1970-01-01
                      • 2013-11-13
                      • 2017-06-02
                      • 2018-01-23
                      • 1970-01-01
                      • 2020-08-23
                      • 2014-05-04
                      相关资源
                      最近更新 更多