限制Tcl应用程序的并发实例数并查询数据库文件的连接数?

问题描述 投票:0回答:1

这两个问题是在运行 Tcl 应用程序的单个桌面计算机的上下文中连接到本地存储的 SQLite 数据库并且不涉及到它们的外部连接。

  1. 是否可以限制操作系统在任意时间打开一个 Tcl 应用程序实例? (我还没有这样做,但计划将其放入明星套件中。)Tcl 充当本地服务器,我想我可以使用硬编码端口,这样第二个实例将无法在同一端口;但我一直要求 Tcl 打开一个随机未使用的端口,以避免与可能正在运行的其他应用程序发生相同的冲突。

  2. 如果同时打开 Tcl 应用程序的两个实例,是否有一种方法可以在一个实例中“知道”另一个实例已经打开到特定 SQLite 数据库文件的连接?或者,是否可以查询 SQLite 数据库来计算连接数,而不管哪些应用程序“拥有”连接?

提出这个问题的原因是,我试图让用户很难意外地从两个位置编辑自己的内容并最终毁掉或丢失它。我使用浏览器作为 UI,虽然这会导致复杂性,但只要 Tcl 应用程序只有一个实例在运行,似乎就可以在 Tcl 中对其进行管理。

如果我尝试跟踪数据库中的状态,问题似乎是用户总能找到一种方法来关闭浏览器 UI(即使在应用程序模式下,也许是 kiosk 模式下),而没有可靠的方法来通知 Tcl 进行更改数据库中的状态。

感谢您提供的任何指导。

sqlite tcl
1个回答
0
投票

限制运行实例的数量相当尴尬,尤其是在容器和多用户系统的上下文中。关键问题是,虽然您可以将当前应用程序实例标识写入某个文件(可能是数据库),但您无法确定文件中当前的信息是否准确;可能会发生崩溃(包括硬件崩溃)。我想您也许可以使用 dbus 来发现实时进程; dbus 会话将具有正确的范围。 (其他平台上必须存在等效项;它太有用了。)

lsof
这样的程序可以告诉您进程打开了哪些文件。如果您告诉它列出您正在运行的特定进程(即,不为其他用户运行),那么它的速度相当快。还可以直接从
/proc
获取很多信息。

也就是说,我会构建允许并发访问的结构,并完全忽略我的前两段。保持事务简短但连贯(这就是重点!),您将获得合理的性能。您不必每次

INSERT
使用一笔交易;如果您需要一次进行多项更改以获得整体一致性,您“应该”这样做,并通过显式事务来完成。只是不要在事务中进行长时间处理。

© www.soinside.com 2019 - 2024. All rights reserved.