使用 Perl 访问 BerkeleyDB 的正确方法是什么?

2024-01-11

我在使用 BerkeleyDB 时遇到了一些问题。我有相同代码的多个实例指向单个数据库文件存储库,并且一切正常运行 5-32 小时,然后突然出现死锁。命令提示符会在执行 db_get 或 db_put 或游标创建调用之前停止。所以我只是询问处理这些电话的正确方法。这是我的总体布局:

这是环境和数据库的创建方式:

my $env = new BerkeleyDB::Env ( 
   -Home   => "$dbFolder\\" , 
   -Flags  => DB_CREATE | DB_INIT_CDB | DB_INIT_MPOOL) 
   or die "cannot open environment: $BerkeleyDB::Error\n";

my $unsortedHash  = BerkeleyDB::Hash->new (
   -Filename => "$dbFolder/Unsorted.db", 
   -Flags => DB_CREATE,
   -Env  => $env
   ) or die "couldn't create: $!, $BerkeleyDB::Error.\n";

此代码的单个实例运行,转到站点并保存要由另一个实例解析的 URL(我设置了标志,以便在锁定一个数据库时每个数据库都被锁定):

        $lk = $unsortedHash->cds_lock();
        while(@urlsToAdd){
            my $currUrl = shift @urlsToAdd;
            $unsortedHash->db_put($currUrl, '0');
        }
        $lk->cds_unlock();

它定期检查是否有一定数量的项目处于未排序状态:

$refer = $unsortedHash->db_stat();
$elements = $refer->{'hash_ndata'};

在将任何元素添加到任何数据库之前,它首先检查所有数据库以查看该元素是否已经存在:

if ($unsortedHash->db_get($search, $value) == 0){
    $value = "1:$value";
}elsif ($badHash->db_get($search, $value) == 0){
    $value =  "2:$value";
....

下一个代码紧随其后,它的许多实例都是并行运行的。首先,它获取未排序的下一个项目(没有繁忙值“1”),然后将该值设置为繁忙“1”,然后对其执行某些操作,然后将数据库条目完全移动到另一个数据库(它是从未排序中删除并存储在另一个数据库中):

my $pageUrl = '';
my $busy = '1';
my $curs;
my $lk = $unsortedHash->cds_lock(); #lock, change status to 1, unlock
########## GET AN ELEMENT FROM THE UNSORTED HASH #######
while(1){
    $busy = '1';
    $curs = $unsortedHash->db_cursor();
    while ($busy){
        $curs->c_get($pageUrl, $busy, DB_NEXT);
        print "$pageUrl:$busy:\n";
        if ($pageUrl eq ''){
            $busy = 0;
        }
    }
    $curs->c_close();
    $curs = undef;

    if ($pageUrl eq ''){
        print "Database empty. Sleeping...\n";
        $lk->cds_unlock();
        sleep(30);
        $lk = $unsortedHash->cds_lock();
    }else{
        last;
    }
}

####### MAKE THE ELEMENT 'BUSY' AND DOWNLOAD IT 


$unsortedHash->db_put($pageUrl, '1');
$lk->cds_unlock();
$lk = undef;

在其他所有地方,如果我在任何数据库上调用 db_put 或 db_del,它都会被锁包裹起来,如下所示:

print "\n\nBad.\n\n";
        $lk = $badHash->cds_lock();
        $badHash->db_put($pageUrl, '0');
        $unsortedHash->db_del($pageUrl);
        $lk->cds_unlock();
        $lk = undef;

但是,我的 db_get 命令是自由浮动的,没有锁,因为我认为读取不需要锁。

我已经检查了这段代码一百万次,算法是无懈可击的。所以我只是想知道我是否执行了错误的任何部分,使用了错误的锁等等。或者是否有更好的方法来防止 BerkeleyDB 和 Strawberry Perl 发生死锁(甚至诊断死锁)?

UPDATE


但是,我的 db_get 命令是自由浮动的,没有锁,因为我认为读取不需要锁。

这个假设是错误的。作为http://pybsddb.sourceforge.net/ref/lock/page.html http://pybsddb.sourceforge.net/ref/lock/page.html说,BerkeleyDB 必须在内部发出读锁,否则如果读者试图读取正在更改的数据,则可能会出现未定义的行为。因此读取很容易成为死锁情况的一部分。

在存在游标的情况下尤其如此。读取游标对已读取的所有内容保持锁定,直到游标关闭为止。看http://pybsddb.sourceforge.net/ref/lock/am_conv.html http://pybsddb.sourceforge.net/ref/lock/am_conv.html有关更多详细信息,您可能会陷入僵局(事实上,您甚至可能自己陷入僵局)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Perl 访问 BerkeleyDB 的正确方法是什么? 的相关文章

  • 编程错误:(psycopg2.errors.UndefinedColumn)关系“task_fail”的列“execution_date”不存在

    我正在尝试在气流中运行 DAG 以将数据集摄取到谷歌云存储 这是 DAG 脚本 import os from airflow import DAG from airflow utils dates import days ago from
  • IndexedDB - 对象存储与多个数据库与索引?

    我想知道什么时候使用单个数据库与具有多个对象存储的数据库是一个好主意 我阅读了网络上的大多数教程并查看了 indexedDB 的规范 但找不到比较这些不同概念的好例子 有没有人有此类事情的具体示例 使用多个对象存储和 或代码的设计模型 只要
  • 删除 mysql 数据库中超过 3 个月的行的作业

    我们使用 mysql 服务器作为集中式日志系统 我希望有一项工作来定期删除 清理超过 3 个月的表条目 做这个的最好方式是什么 提前致谢 hinling 您是否在字段中存储项目的创建日期 If so DELETE FROM myTable
  • 如何识别 SQL Azure 中的死锁?

    我有一个由两个实例组成的 Windows Azure 角色 有时交易会失败并显示SqlException与以下文字 事务 进程 ID N 在锁资源上与另一个进程发生死锁 并被选为死锁牺牲品 重新运行事务 现在我已经谷歌搜索了一段时间并阅读这
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 将 Access 数据库转换为 SQL Microsoft DTS - 数据类型“130”不在映射文件中

    我正在尝试将大型 Access mdb 数据库导出到 SQL Server 数据库 但遇到了 Microsoft DTS 无法识别 Access 数据库中特定类型字段的数据类型的问题 我查看了相关的访问表 它们被设置为长度为 1 的 文本
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 如何在 perl 中合并两个数组,交替每个数组中的值

    假设我有 2 个如下所示的数组 a1 Vinay Raj harry b1 dude rock 合并后我想要这样的结果 Vinay dude Vinay rock Raj dude Raj rock harry dude harry roc
  • Perl 的反引号、system 和 exec 有什么区别?

    有人可以帮帮我吗 在 Perl 中 以下之间有什么区别 exec command and system command and print command 还有其他方法可以运行 shell 命令吗 exec 执行命令并一去不复返 这就像一个
  • 如何用perl逐句读取文本文件?

    我想逐句读取文本文件 我的问题是下面的代码仅根据时期分开 usr bin perl use strict use warnings my file data txt open FILE file my buffer while my sen
  • 如何将会话管理添加到简单的 Perl CGI 网页?

    我有一个简单的网页 到目前为止不需要任何登录 它是用 Perl CGI 编程的 我想知道添加会话支持以便获得登录信息的步骤 我不需要非常复杂的方法 因为网页非常简单 另外 我想要一些关于支持 Perl 会话所需的技术 库的建议 我在很多很多
  • 我可以根据多列删除数据库重复项吗?

    I 不久前问过这个问题 https stackoverflow com questions 4952250 how to delete duplicates from a database table based on a certain
  • 如何重命名 MySQL 数据库(更改架构名称)?

    如何快速重命名 MySQL 数据库 更改其架构名称 通常我只是转储数据库并使用新名称重新导入它 对于非常大的数据库来说 这不是一个选项 显然RENAME DATABASE SCHEMA db name TO new db name 做了坏事
  • 通过 SQLAlchemy 获取随机行

    如何使用 SQLAlchemy 从表中选择一个或多个随机行 这在很大程度上是一个特定于数据库的问题 我知道 PostgreSQL SQLite MySQL 和 Oracle 具有通过随机函数排序的能力 因此您可以在 SQLAlchemy 中
  • Android中不同线程的数据库访问

    我有一个在 AsyncTasks 中从互联网下载数据的服务 它解析数据并将其存储在数据库中 该服务持续运行 当服务写入数据库时 活动会尝试从数据库中读取更改 我有一个数据库助手 有多种写入和读取方法 这会导致问题吗 可能尝试从两个不同的线程
  • 如何更新 pl/sql 中嵌套表的列? [复制]

    这个问题在这里已经有答案了 我正在尝试在表中创建一个可以存储多个值的列 如下所示 我有一个学生id std和一个名为marks可以采用几个值 例如2 3 4 我想更新此列表以添加另一个标记2 3 4 5但我不知道怎么做 我如何更新专栏mar
  • 在 Perl 中使用数据引用的正确方法

    我有一组想要处理的数据 为了简化我的代码 最好通过指向原始数据的引用数组来访问我的数据的某些子集 比解释更好的是 我写下了这个例子 它还没有工作 最后 我想更新原始数据 而不必更新所有子集 用 Perl 可以做这样的事情吗 usr bin
  • 如何在附加的 sqlite 数据库中创建外键?

    我正在尝试创建一个 sqlite3 数据库作为模拟生产环境的测试环境 由于生产的设置方式 表处于多个模式中 我已经在 DBIx Class 中设置了类 使用 schema gt storage gt dbh do将数据库与架构附加在一起 并
  • sqlite3从打印数据中删除括号

    我创建了一个脚本 用于查找数据库第一行中的最后一个值 import sqlite3 global SerialNum conn sqlite3 connect MyFirstDB db conn text factory str c con
  • 无法从日志文件中提取特定信息

    我这里有日志文件我想提取以下信息 想要提取十六进制值 如果该行有第二个括号 0 9 想要提取十进制值 首先转换为十六进制 然后提取 9 gt 0x09 想要提取负值 25 先转换为十六进制然后提取 例如 25 gt FFE7 gt 想要提取

随机推荐

  • 无法在asp.net中动态添加多个服务器控件

    您好 几天来我真的陷入了一项开发任务中 我无法弄清楚究竟发生了什么 请帮忙 我正在尝试将行动态添加到网页 如下所示 我想使用服务器控制 但我无法添加多于一行 即使我使用了会话变量 也没有运气 请帮忙 aspx文件 div div
  • PHP gettext:并非所有字符串都会被翻译

    我有这两行相邻的代码 td td td td po 文件中的这些翻译 msgid Product Translates msgstr Produkt msgid Quantity does not translate msgstr Anta
  • Django WSGI 和 Gunicorn

    这可能是一个非常愚蠢的问题 我正在尝试使用 Gunicorn 部署 Django 应用程序 但是 我刚刚创建了 wsgi py 如下所示 wsgi py 位于我的根项目文件夹中 import os os environ setdefault
  • IE 忽略 HTML SUB 元素的字体大小? [复制]

    这个问题在这里已经有答案了 可能的重复 IE 中 或 及其后代的相对字体大小 https stackoverflow com questions 6804383 relative font size of sub or sup and th
  • 使用 Jack 工具链构建 Android 应用程序时出现“使用 jack 编译时无法测试模糊变体”错误

    我正在尝试按照本文中的步骤在我的 Android 项目中启用 Jack 工具链https developer android com preview j8 jack html https developer android com prev
  • 海量文本数据分割算法

    我有一个动态填充的文本区域 具体来说 我在 Qt 中有一个 QPlainTextEdit 但对于算法建议并不重要 现在的问题是有时会出现大量数据 随着更多数据进入我的应用程序 我的应用程序会变得很重 因为所有文本数据都在主内存中 所以我想到
  • Web 进程未能在启动后 60 秒内绑定到 $PORT

    有人可以向我解释 Heroku 上的此错误消息吗 应用程序在本地运行良好 但在网上从未成功 heroku slug compiler Slug compilation started heroku slug compiler Slug co
  • 如何使用 VBScript 在 Windows Vista 中创建用户帐户?

    如何使用 Windows Vista 创建用户帐户VBScript http en wikipedia org wiki VBScript 我正在使用以下脚本 它在 Windows XP 上工作正常 但在 Windows Vista 上出现
  • 必需属性不适用于 Angular Js 中的文件输入

    我的表单中有一个文件上传控件 我正在使用 Angular JS 当我输入必需的属性来验证文件是否已选择时 它不起作用
  • Rails 3 迁移:添加参考列?

    如果我创建一个新的 Rails 3 迁移 例如 rails g migration tester title tester user references 一切正常 但是 如果我添加一个列 其中包含以下内容 rails g migratio
  • Apache Spark——使用spark-submit抛出NoSuchMethodError

    要将 Spark 应用程序提交到集群 他们的文档指出 为此 请创建一个包含代码及其依赖项的程序集 jar 或 uber jar sbt 和 Maven 都有汇编插件 创建程序集 jar 时 将 Spark 和 Hadoop 列为提供的依赖项
  • 在 Heroku 上部署 Django 博客期间显示错误

    当我在 heroku 中部署应用程序时显示此错误 remote ERROR Could not find a version that satisfies the requirement apturl 0 5 2 from r tmp bu
  • 使用scrapy+splash返回html

    我正在尝试弄清楚 scrapy 和splash 作为练习 我尝试让闪屏点击以下 javascript 重度网站上的按钮 http thestlbrowns com http thestlbrowns com 然后返回新渲染页面的html 我
  • Xcode Playground 中的自定义字体

    我正在用代码编写界面布局 由于每次我逐像素测试字体大小或视图布局时重新加载应用程序很烦人 所以我开始在操场上这样做 这确实有很大帮助 但我确实很怀念那里的自定义字体 有没有办法向您的游乐场添加自定义字体 首先 将 ttf 文件添加到 Pla
  • Mysql 中 SQL join ON 不相等

    我有两张桌子 两者都包含问题 ID 字段 我想从第一个表中获取第二个表中不存在的所有记录 我不想使用 NOT IN 约束作为具有超过 400000 条记录的第二个表 尝试类似的东西 SELECt t1 FROM Table1 t1 LEFT
  • 还没有适用于 Python 3(或 3.3)的 wxPython 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想开始使用 wxPython 但我发现它没有针对 Python 3 进行更新 我正在使用最新版本的 Python 即 3 3 所以我开始
  • sonarqube 5.2 后台任务有时会失败且没有日志

    似乎有超过一半的时间我尝试使用 Sonar Runner 2 4 对几个不同的项目执行分析 分析成功完成 但发布 通过后台任务 到 SonarQube 失败 我在 SonarQube 服务器上找不到包含失败任务相关信息的日志 至少我找不到任
  • ERROR:ssl_client_socket_openssl.cc(1158)] ChromeDriver Chrome 浏览器和 Selenium 握手失败

    当使用 Chrome 驱动程序运行我的 python selenium 脚本时 每次加载页面时我都会收到以下大约三个错误消息 即使一切正常 有没有办法抑制这些消息 24412 18772 0617 090708 错误 ssl client
  • 激活/停用移动菜单并调整大小后桌面菜单消失

    该网站是响应式网站 您可以通过以下方式复制问题 以桌面宽度加载网站 导航元素加载良好 调整大小为平板电脑或手机大小 菜单转换为带有三栏图标的移动式下拉菜单 打开和关闭移动导航菜单 设置为显示 无 现在 当您调整大小到桌面宽度时 导航栏仍设置
  • 使用 Perl 访问 BerkeleyDB 的正确方法是什么?

    我在使用 BerkeleyDB 时遇到了一些问题 我有相同代码的多个实例指向单个数据库文件存储库 并且一切正常运行 5 32 小时 然后突然出现死锁 命令提示符会在执行 db get 或 db put 或游标创建调用之前停止 所以我只是询问