如何检查是否连接池将被清除

问题描述:

我要重命名的数据库文件,甚至我用using与连接每一次我要叫:如何检查是否连接池将被清除

FirebirdSql.Data.FirebirdClient.FbConnection.ClearAllPools(); 

的问题是,这种方法不会阻塞线程我不知道如何检查是否所有的连接都被清除,因为如果我得到的值:

FirebirdSql.Data.FirebirdClient.FbConnection.ConnectionPoolsCount 

这是零的方法后,但我仍然不能重命名数据库文件。如果我在方法之后设置了一些超时(我试过1秒),那么文件没有被锁定,我可以重命名它。问题在于,这种超时在不同的机器上肯定会有所不同。

FWIK唯一的其他方法,如何检查,如果该文件没有被锁定是尝试与一些超时循环中的重命名,但如果锁被从我的应用程序连接或从别的地方做我不能肯定。
那么有没有更好的方法,我可以等到这种方法清除连接?

+0

可能,这将帮助:HTTP://www.firebirdfaq.org/faq10/ –

+0

@ValMarinov我知道,在我的测试场景我只从我的应用程序连接,因此它是我的应用程序,它的锁该文件,但我不知道多久... – Artholl

+3

强制关闭数据库文件可能是一个更好的方法,这将强制关闭现有的连接。请参阅[数据库启动和关闭](https://www.firebirdsql.org/file/documentation/reference_manuals/user_manuals/html/gfix-dbstartstop.html) –

使其成为格式化列表的目的给出的答案。

@Artholl你不能安全地依靠自己的断路一堆理由。

  1. 可能还有其他连接的程序,不仅仅是你正在运行的程序。除非您使用SYSDBA或数据库创建者或RDB $ ADMIN角色进行连接,否则无法查询是否有其他连接。 但是,你可以查询,从MON$ATTACHMENTS,使用相同的用户作出的CURRENT_CONNECTION的连接。这可能有助于您检查应用程序自己的池的状态。只是没有什么实际价值。

  2. 中的SuperServer模式火鸟3有灵儿参数,这意味着服务器将保持打开数据库的最后一个客户端断开连接后一段时间,预计,如果一些新的客户端可能会决定再重新连接PAGE CACHE为DB文件已经到位。就像中等负载的WWW服务器一样。即使在Firebird 2中,每个打开的数据库都有一些缓存,它将是安装特定的(firebird.conf)和数据库特定的(gfix/gstat)缓存的大小。在引擎看到所有断开连接的客户端决定关闭数据库之后 - 它开始刷新缓存并要求操作系统刷新它们的缓存(没有通用的硬件独立方式来要求RAID控制器和磁盘本身刷新缓存,或者火鸟会试图做到这一点)。默认情况下,Firebird缓存很小,抢占硬件层的速度应该很快,但仍然不是即时的。

  3. 即使你检查了所有其他客户端都断开,然后你自己断开,然后你猜中等待多久灵儿和高速缓存,即使如此,你仍然是不安全的。您必须遵守竞赛条件。在你开始做某些需要显式拥有DB的时候,可能会发生一些新的客户端同时打开他的新连接。

所以正确的方法将不仅证明没有数据库连接的权利,但也保证不能有未来任何新的连接,直到您重新启用它。

因此,正如Mark上面所说的,您必须使用Shutdown方法将数据库置于不允许连接的状态。在完成文件重命名和其他操作后 - 将其切换回正常模式。

https://www.firebirdsql.org/file/documentation/reference_manuals/user_manuals/html/gfix-dbstartstop.html

如果我是负责维护火鸟提供商,我不希望用户能够依靠这样的功能。

其他应用程序可能有文件打开(你只是在当前AppDomain连接池的控制),服务器可能运行某种数据库的维护。

所以,即使你可以等待池被清除,我会争辩说,如果你真的真的必须弄乱这些文件,更强大的解决方案是停止firebird服务,而不是(而是等待它已经完全停止)。

+0

我知道我只能通过“我的”连接进行控制,但是知道如何检查我是否实际有活动连接还是很好的。你的想法更好。这也不是很理想,因为有人可以从其他计算机连接到该文件,但它肯定比您写的更强大。 – Artholl

+0

@Artholl数据库文件不应该共享;他们只能通过Firebird服务器访问。 –

+1

请注意,没有必要关闭整个Firebird服务器,您可以关闭一个单独的数据库(请参阅我对该问题的评论)。 –