将sqlite3命令从主进程传递给子进程:可能吗?

y1aodyip  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(173)

我正在用Tcl做实验,看看子进程是否可以在不阻塞主进程的情况下执行。
我想将dbws命令和通道chan传递给子进程,让它检索数据并将其写入通道,而不阻塞主进程。我意识到有一个-command选项可以在后台执行此操作,但我想知道这是否可能出于其他原因。
你能告诉我是否有可能传递一个sqlite3命令给一个子进程,而不是打开一个新的连接到同一个数据库吗?我无法让子进程识别sqlite命令。
谢谢大家。

package require sqlite3
if { [catch {sqlite3 dbws -create $db_name false -readonly false} result] } {
  chan puts stdout "result: $result"
  exit
}

puts stdout "Return value of exectest.tcl is:\
 [exec [info nameofexecutable] exectest.tcl dbws $chan]"
wxclj1h5

wxclj1h51#

答案是一个简单的
SQLite库需要数据库的真实的文件名,以便访问回滚日志等内容;它不只是不解释地将名称传递给open()系统调用。即使在线程之间也不共享连接,这也是一个很好的实践;有些语言会这样做,但这不是一个好的计划。(特别是,在单个连接中同时从两个线程启动事务是非常糟糕的。
SQLite的Tcl接口保持每个连接严格的解释器绑定(所有命令都是如此),这意味着被绑定到单个进程的单个线程。它根本不公开任何底层文件描述符,但即使公开了,使用它们也是一个非常糟糕的主意。让每个需要数据库连接的解释器打开它自己的数据库。或者将工作委托给单个线程(写繁重的工作负载最好这样做,并可能根据应用程序用例调整事务的工作方式)。

相关问题