我有一个模糊的回忆,Firebird 的 isql 实用程序在某些情况下会与数据库建立独占连接,这意味着任何其他连接尝试都将被拒绝。
我找不到有关此的信息。
谁能解释在哪些情况下会发生这种情况,特别是我如何确保它不会发生?
我的预期用途是在计划任务中执行一些命令/查询,并且我不想冒在此任务执行时阻塞其他数据库工作的风险。
从一些简单的测试来看,我似乎得到了一个独占连接,即当没有其他连接存在时,不允许其他连接。反之,如果isql连接时还有其他连接,isql的连接不会阻塞其他连接。
我在超级服务器模式下使用 Firebird 3.0.4 和 FlameRobin 对此进行了测试,对 isql 和 FlameRobin 连接使用相同的数据库别名。别名是使用绝对本地文件路径定义的。
我是否应该包含主机和端口以确保 isql 始终通过超级服务器连接(允许其他连接)而不是直接打开文件(阻止其他连接)?
好的,所以进一步的测试似乎表明发生了什么:
如果为 isql 的连接指定的数据库只是一个本地文件路径(可能间接通过别名),isql 将首先尝试通过直接打开文件来连接。这将是用于经典(和超经典?)模式的那种连接。所以它本身并不是独占的,但与超级服务器不兼容。如果文件已被锁定,如果超级服务器与其有连接,isql 将尝试通过超级服务器进行连接。在这种情况下,连接显然不会以任何方式阻塞任何其他连接。
因此,为了确保在使用 isql 时其他(超级服务器)连接永远不会被阻塞,isql 的命令行应该指定一个 TCP/IP 连接字符串,如下所示:
如果使用这样的连接字符串,其他(超级服务器)连接就可以正常工作。