monetdbe:多个连接读取与写入

monetdbe: multiple connections reading vs writing

我发现使用 monetdbe(嵌入式,Python),我可以从两个进程同时将数据导入两个表,但我不能执行两个 SELECT 查询.

例如,如果我 运行 这个 Bash:

(python stdinquery.py < sql_examples/wind.sql &); (python stdinquery.py < sql_examples/first_event_by_day.sql &)

然后我从一个进程中得到这个错误,而另一个进程很好地完成了它的查询:

monetdbe.exceptions.OperationalError: Failed to open database: MALException:monetdbe.monetdbe_startup:GDKinit() failed (code -2)

我有点惊讶它可以同时写入两个表但不能同时读取两个表。我是不是忽略了什么?

我的 stdinquery.py 只是:

import sys
import monetdbe

monet_conn = monetdbe.connect("dw.db")
cursor = monet_conn.cursor()
query = sys.stdin.read()
cursor.executescript(query)
print(cursor.fetchdf())

您正在启动多个并发 Python 进程。其中每一个都尝试在 dw.db 位置的磁盘上创建或打开数据库。这行不通,因为嵌入式数据库 进程 相互不了解。

使用 monetdbe 的核心 C 库,可以编写多线程应用程序,其中每个连接应用程序线程都使用自己的连接对象。请参阅此用 C here 编写的示例。同样,这仅适用于单个 monetdbe 进程中的并发线程,不适用于声明相同数据库位置的多个并发 monetdbe 进程。

不幸的是,目前无法使用 Python monetdbe 模块来设置类似于上面 C 示例的内容。但可能在下一个版本中 将有可能使用例如concurrent.futures 在 Python 中写类似的东西。