C# MySql连接,我可以让它保持打开状态吗?

C# MySql连接,我可以让它保持打开状态吗?,c#,mysql,connection,C#,Mysql,Connection,在整个会话期间保持连接打开是否明智? 我制作了一个连接到MySql数据库的C#应用程序,该程序对其进行读写操作,并且该应用程序必须每天不间断地运行大约10个小时 每次从数据库中提取某些内容并在需要新内容时再次打开该连接,而不是调用close()函数时,保持连接打开是否存在任何风险?如果应用程序正在使用该连接,则没有理由关闭它。如果你不需要连接,你应该关闭它。如果要让多个应用程序连接到数据库,则该数据库的连接数是固定的。这就是为什么完成后最好关闭,需要时最好重新打开 保持连接打开一段时间是可以的,

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


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

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

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

  • 您没有太多并发空闲连接,以至于达到MySQL连接限制

  • 你不能什么都不做就把它打开好几个小时。默认的MySQL连接
    wait\u timeout
    为8小时;将一个连接保持不活动状态那么长时间,当您下次使用它时,您将收到一个“MySQL服务器已消失”错误


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

    随着性能的提高,在整个过程中打开连接显然更好


    您的选择^^

    因为您使用的是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中应该这样做。

    不,我看不出有任何理由不让连接保持打开状态并重新使用它:毕竟,这是各种连接池技术背后的全部要点(尽管这些通常是为多线程情况保留的,在这些情况下,工作都在同一数据源上运行)


    但是,为了进一步说明bobince的答案,-只是因为您没有关闭连接,不要假设其他东西不会关闭:连接可能超时,可能存在连接问题,或者连接死亡的其他原因。您需要假设连接可能不在那里,并为此向代码添加逻辑例外情况。

    我认为保持连接打开不是一个好的做法。
    每次关闭连接的另一个方面是可伸缩性。现在让它保持打开状态可能没问题,但如果你的应用程序被两倍于三倍的用户使用会怎么样。回去更改所有代码是一件痛苦的事。(我知道我已经做到了:-)

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


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

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

    如果您不断打开和关闭连接,您将支付性能损失。如果您担心此问题,使用连接池和短时间的
    等待\u超时可能是明智的太多的应用程序运行副本将占用太多的数据库连接。

    可以,前提是:

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

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

    我认为,如果有连接池机制,最好关闭连接


    其中一个原因是,您不需要重新检查连接是否仍处于活动状态。

    情况并非如此,这是唯一正在运行的应用程序,其他任何应用程序都不应该尝试连接。我从未听说过,在这种情况下,您会断开连接。如果您的应用程序可以自动nd透明地重新建立连接,那么它不会为您提供任何额外的安全性(事实上,您会丢失一些,因为每次身份验证都会暴露一点点信息)。事实上,流行的称为连接池的内置功能会使连接保持打开状态,即使您告诉代码关闭连接,这样连接就可以被另一个进程重用,而无需进行身份验证。因此,当连接打开时,连接将自动重新建立?还是我必须编写自己的代码e来检测吗?保持连接打开(a)实际上没有什么好处