2009-11-10 115 views
12

在整个会话期间保持连接是否明智? 我做了一个连接到MySql数据库的C#应用​​程序,程序都读取和写入它,应用程序必须每天运行10个小时不间断。MySql连接,我可以打开它吗?

是否有连接到每一个时间保持连接打开,而不是调用close()函数,你已经从数据库开放弹拨东西后再次当你需要一些新的危险吗?

回答

8

离开连接打开一会儿是好的,只要:

  1. 你没有说你打了MySQL连接限制这么多的同时空闲连接;

  2. 你不要让它打开小时没有做任何事情。默认的MySQL连接wait_timeout是8小时;让连接长时间处于非活动状态,当你下次使用它时,你会得到一个“MySQL服务器已经消失”的错误。

+2

通过保持连接处于打开状态(假定提供程序使用连接池),没有什么可以实现的。官方MySQL Connector/Net提供程序默认使用连接池。 OP没有提及他们实际使用哪个提供者,但是如果它确实支持共享,那么我将使用开放迟到/关闭早期策略并让提供者管理底层物理连接。 – LukeH 2009-11-10 13:10:36

+0

对于旧线程添加注释感到抱歉。我阅读http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html,似乎只要您的应用程序具有多线程/事务,最好将每个线程分配给不同的连接。谢谢。 – 2011-01-04 08:43:51

0

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

0

从安全的角度来看,我要说它更好的查询后,将其关闭,只是为了确保没有其他程序可以注入它自己的东西放到打开的连接。

由于性能conered,这显然是最好有在整个时间打开的连接。

您所选择的^^

9

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

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

你只需要在本地建立连接时,你需要他们,因为他们在backrgound正在汇集所以有创建一个新的连接没有任何开销:

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中。

0

不,我看不出有任何理由不留下连接打开,并重新使用它:毕竟,这是背后的各种连接池技术,这些技术对整个点(尽管这些通常被保留下来对于工作都在相同数据源上运行的多线程情况)。

但是,为了扩大bobince的答案, - 只是因为你没有关闭连接,不要认为别的不会:连接可能会超时,可能有连接问题或一百一百其他原因为什么你的连接死亡。您需要假定连接可能不在那里,并为此异常情况添加逻辑代码。

0

在我看来,保持连接畅通是不好的做法。 另一个说每次关闭连接的方面都是可扩展性。现在开放它可能没什么问题,但如果你的应用程序使用量是用户数量的3倍,那该怎么办?返回并更改所有代码是一件痛苦的事情。 (我知道我已经做到了:-)

0

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

当然我的意见是,获得连接的一个实例,使用它,提交/回滚你的工作并将其返回到池中。我不会建议保持连接这么久。

0

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

0

如果您经常打开和关闭连接,您将支付性能损失。如果您担心应用程序的运行副本太多会占用过多的数据库连接,那么使用连接池和短小的wait_timeout可能是明智之举。

+0

事实并非如此,这是唯一正在运行的应用程序,甚至没有其他人应该尝试连接。 – Pieter888 2009-11-10 13:00:50

+1

在这种情况下,我从未听说过你想要拆除连接。如果您的应用可以自动且透明地重新建立连接,那么它不会提供任何额外的安全性(事实上,您会因为每次验证都暴露一小部分信息而失去一些安全性)。 实际上,流行的内置功能称为连接池,即使您告诉代码关闭连接,连接仍会保持打开状态,以便连接可以被另一个进程重用,而无需进行身份验证。 – MightyE 2009-11-10 13:33:02

+0

因此,当连接打开*时,连接将自动重新建立。还是我必须编写自己的代码来检测? – Pieter888 2009-11-12 14:57:26

0

当然可以,前提:

  • ,如果你失去了连接
  • 您可以重置连接状态,如果有什么奇怪的事情发生
  • 你会发现,如果连接“安静下来”你会重新连接,例如,如果发生防火墙超时

基本上它需要很多关注失败情况和正确的恢复;连接和断开通常要容易得多。

0

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

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

相关问题