monetdb - monetdbe:读取与写入的多个连接
问题描述
我发现使用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 编写的示例。同样,这仅适用于单个 monetdbe 进程中的并发线程,而不适用于声明相同数据库位置的多个并发 monetdbe 进程。
不幸的是,目前无法使用 Pythonmonetdbe
模块来设置类似于上面 C 示例的内容。但可能在下一个版本中,将可以使用例如concurrent.futures
在 Python 中编写类似的东西。
推荐阅读
- javascript - 需要明确异步功能
- python - 根据计数替换变量名称
- python - 从没有外键 Django 的表中创建表单
- java - 如何使用 tfs Java sdk 切换工作项的状态
- c# - 使用 AES 加密对存储在数据库中的加密数据进行解密会引发异常
- amazon-web-services - 如何快速将 100 个 Lambda 函数从一个区域移动到另一个区域?
- .net-core - .Net Core 测试在 CDPX 构建管道中失败
- oop - Liskov vs 覆盖
- google-apps-script - 是否可以批量生成 TSV 文件,每个文件都在一个电子表格选项卡内的相关列中获取所有数据?
- html - 我想在 HTML 中创建一个点击激活菜单