当子类化 DBI 时,Perl DBI 将设置 SQLite DB cache_size 视为写入操作

2023-12-11

我有一个 Perl 程序,在过去两年里我们每天都成功运行,但今天崩溃并显示错误消息:

致命错误:无法执行 PRAGMA cache_size = 1000000:尝试写入只读数据库

有问题的 SQLite 数据库是只读的,并且一直都是,并且代码始终使用PRAGMA cache_size = 1000000打开其只读连接后立即对其进行操作。

设置cache_size不是写操作,如果我直接通过DBI访问数据库也不会失败,如下所示:

$dbh->do("PRAGMA cache_size = 1000000")

但是,代码使 SqliteH::db 成为 DBI::db 的子类,然后从子类调用此函数:

$self->SUPER::do("PRAGMA cache_size = 1000000")

现在它因“DBD::SQLite::db 失败:尝试在 /local/ifs_projects/prok/function/src/lib/SqliteH.pm 第 329 行写入只读数据库”而终止。

该代码适用于 CentOS 5、Perl 5.10.1、DBD::SQLite 1.29 和 DBI 1.611。 它不适用于 CentOS 6、Perl 5.16、DBD::SQLite 1.39 和 DBI 1.627。 然而,我很困惑它上周在 CentOS 6 和 Perl 5.16 上是否可以工作。 IT 可能在周末升级了 DBD::SQLite 或 DBI。

请不要再次将标题更改为“运行了几个月的程序突然出错”。这是一个无益且不具体的标题。


TL;DR - 如果事务已开启,则任何命令都会尝试写入事务日志。如果数据库是只读的,请从 dbh 连接标志中删除 AutoCommit=>0 [您也不应该有任何 ->begin_work() 或 INSERT/UPDATE 调用,但这永远不会在只读数据库上工作:-) ] 。

事实证明,我今天在更新 SQLite、DBI 和 DBD::SQLite 后遇到了完全相同的问题(所以我不知道到底是哪一个导致了问题),但就我而言,是在 select 上(这使得它更令人费解)。 事实证明,事务是在原始连接字符串中打开的:

my $dbh=DBI->connect('dbi:SQLite:file.db','','',, {PrintError=>1,RaiseError=>1,AutoCommit=>0});

并且,在跟踪代码后,我注意到它实际上在尝试启动事务时崩溃了。

  DB<4> $dbh->trace(15)
    DBI::db=HASH(0x18b9c38) trace level set to 0x0/15 (DBI @ 0x0/0) in DBI 1.627-ithread (pid 15740)
  DB<5> $sth= $dbh->prepare("SELECT key,value FROM annotation where accession=?")
    ...
  DB<6> $sth->execute('D3FET3')
    -> execute for DBD::SQLite::st (DBI::st=HASH(0x18ba340)~0x18ba178 'D3FET3') thr#10cd010
    sqlite trace: bind into 0x18ba268: 1 => D3FET3 (0) pos 0 at dbdimp.c line 1232
    sqlite trace: executing SELECT key,value FROM annotation where accession=? at dbdimp.c line 660
    sqlite trace: bind 0 type 3 as D3FET3 at dbdimp.c line 677
    sqlite trace: BEGIN TRAN at dbdimp.c line 774
    sqlite error 8 recorded: attempt to write a readonly database at dbdimp.c line 79
      !! ERROR: '8' 'attempt to write a readonly database' (err#1)
      <- execute= ( undef ) [1 items] at (eval 15)[/usr/local/packages/perl-5.16.1/lib/5.16.1/perl5db.pl:646] line 2 via  at -e line 1
    DBD::SQLite::st execute failed: attempt to write a readonly database at (eval 15)[/usr/local/packages/perl-5.16.1/lib/5.16.1/perl5db.pl:646] line 2.
    ...

删除 connect() 调用中的 AutoCommit=>0 标志解决了我的问题。

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

当子类化 DBI 时,Perl DBI 将设置 SQLite DB cache_size 视为写入操作 的相关文章

  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • 从 Core Data、iOS 获取最后插入的项目

    有没有办法获取核心数据数据库中最后插入的项目 这将返回最后插入的对象 setFetchLimit 1 和 setFetchOffset 所有条目数 1
  • 如何通过循环变量在 dbt 中多次运行 SQL 模型?

    我有一个 dbt 模型 测试模型 接受地理变量 zip state region 在配置中 我想通过循环变量来运行模型三次 每次使用不同的变量运行它 问题是 我有一个如下所示的宏 它将变量附加到输出表名称的末尾 即运行测试模型 with z
  • Yii 查询时对相关模型的限制

    我遇到了极限问题 我正在使用的代码如下 model PostCategory model record model gt with array posts gt array order gt posts createTime DESC li
  • ChangeState 之后重置/卸载控制器(调用注销)。 AngularJS

    我正在创建一个应用程序 用户可以从 Facebook 或 Twitter 登录 登录后 用户将被定向到某个主页 在这里 控制器加载并调用我的初始函数 该函数加载特定于该用户的数据 当用户单击 注销 时 令牌将被清除 用户将被定向到登录页面
  • SQL:查找每个跑步者跑步之间的平均天数

    因此 如果我们给出下表 runner ran Carol 2011 02 01 Alice 2011 02 01 Bob 2011 02 01 Carol 2011 02 02 Bob 2011 02 02 Bob 2011 02 03 B
  • SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

    在我的错误日志中得到大量结果 如下所列 数据库中的所有表都是 innodb 并且就与这些表的任何交互而言 一切都是带有准备好的语句的 pdo 正如我所说 所有错误几乎与下面列出的错误相同 但发生在几个不同的页面上 无论页面如何 错误行始终指
  • 使用包含空值列的 WHERE 子句的更新语句

    我正在使用另一个表中的数据更新一个表上的列 这WHERE子句基于多个列 并且某些列为空 根据我的想法 这个空值是什么throwing off你的标准UPDATE TABLE SET X Y WHERE A B陈述 See 这个 SQL 小提
  • 如何使用 Perl 和正则表达式将 SQL 文档转换为 ColdFusion 脚本?

    我需要将 SQL 语句文档转换为 ColdFusion 文档 我对正则表达式只有一点经验 而且我是 Perl 超级新手 我昨天刚刚自学了它的基础知识 所以我可以完成这项任务 我正在尝试用 Perl 编写的脚本匹配和替换模式 该脚本保存为 B
  • Yslow 替代方案 - 针对小型网站的优化

    我正在开发一个基于内部网的小型 Web 应用程序 我安装了 YSlow 它建议我做几件事 但它们似乎与我无关 例如 我不需要 CDN 我的应用程序很慢 所以我想减少请求的带宽 我应该遵守 YSlow 的哪些规则 是否有适用于小型网站的替代工
  • 在 Perl 中,如何制作数组的深层复制? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Perl 中制作数据结构深层复制的最佳方法是什么 https stackoverflow com questions 388187 whats the best way to make a dee
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • 如何在 Picasso 中使用磁盘缓存?

    我正在使用 Picasso 在我的 Android 应用程序中显示图像 load image This is within a activity so this context is activity public void loadIma
  • 如何将整行(在 SQL 中,而不是 PL/SQL 中)传递给存储函数?

    我遇到以下 非常简单 问题 我想编写一个 Oracle SQL 查询 大致如下 SELECT count MyFunc MyTable FROM MyTable GROUP BY MyFunc MyTable 在 PL SQL 中 可以使用
  • 按两列的最小值排序

    I use SQL Server 2008 R2 我需要按两列的最小值对表进行排序 该表如下所示 ID integer Date1 datetime Date2 datetime 我希望我的数据按至少两个日期排序 以这种方式对该表进行排序的
  • 帮助我了解实体框架 4 延迟加载的缓存

    我在实体框架 4 0 中遇到了一些意想不到的行为 我希望有人可以帮助我理解这一点 为了解决这个问题 我使用了 Northwind 数据库 我还使用默认的代码生成器 不是 poco 或自我跟踪 我希望每当我查询框架的上下文时 如果我尚未获取这
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • MVC 框架中的缓存策略?

    我编写了自己的小型 PHP MVC 框架 现在正在探索 PHP MVC 框架中的缓存策略 我正在考虑可以缓存什么 在哪里以及如何缓存 我的框架是简单的MVC框架 我有前端控制器 它启动应用程序 注册类自动加载 设置 php 运行时指令 最后
  • 如何使用 Perl 在 Unix 中获取文件创建时间

    如何使用 perl 在 unix 中获取文件创建时间 我有这个命令显示文件的最后修改时间 perl MPOSIX le print strftime d b Y H M localtime lstat 9 for ARGV file txt
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp

随机推荐

  • Conda Build - 创建 Conda 包因平台 win-64 的依赖项而失败

    从本地目录构建我的第一个 conda 包 遵循 CONDA 网站的说明 https conda io docs user guide tasks build packages recipe html 我收到以下错误 conda build
  • SonarQube 分析未显示代码覆盖率

    我有一个 Jenkins 项目来对我的 NodeJS 项目进行 SonarQube 分析 我添加了istanbul作为对我的项目的依赖package json 在 Jenkins 构建配置中 首先我运行一个 shell 脚本 cd proj
  • 最佳适应调度算法

    有多个活动 每个活动都有多个会议时间 我需要找到一种会议时间安排 以便每个日程表仅包含任何给定事件一次 使用每个事件的多个会议时间之一 我可以使用暴力 但这很少是最好的解决方案 我更喜欢任何可以阅读此内容的链接 甚至只是一个我可以谷歌搜索的
  • 当我使用添加函数时断言失败

    在一个表中 我有 3 个索引 每个索引调用一个函数 在每个函数中 都有一个添加按钮 用于将数据添加到 CoreData 中 前 2 个有效 但是当我按第三个索引并按 Add 时 会出现此错误 2011 07 19 16 57 11 079
  • Powershell 转义包含密码的变量

    因此 我使用一个包含密码的变量 最近发现某些密码包含特殊字符 我无法控制密码是什么 所以我必须处理我收到的任何内容 我知道后面的勾号 字符是用来转义字符的 这篇文章的全部原因是我发现密码是文本文件 并将找到的密码替换为 xxxxxxxxx
  • 在 Android 中向 gridview 添加页眉和页脚

    我正在尝试在我的 Android 应用程序中创建具有以下功能的用户个人资料页面 标题 gridview 显示该用户的一堆照片 页脚 当应用程序在网格视图中下载更多照片时的下载图标 header需要与gridview一起移动 换句话说 个人资
  • QTableWidget-自动公式驱动单元格

    是否可以使一个单元格成为公式驱动单元格并使其自动更新 与Excel类似 例如 我希望用户填写两个单元格 然后当用户填充两个单元格时 第三个单元格将自动划分 我希望它不连接到按钮 QTable 截图 QTableWidget 的代码 self
  • 每次我使用格式化程序写入txt时,以前写入的内容都会被删除?如何避免这种情况?

    import java io FileNotFoundException import java lang SecurityException import java util Formatter import java util Form
  • Javascript 奇怪的作用域行为

    我一直在研究 Javascript 函数作用域并遇到了这个 var scope global function f console log scope var scope local console log scope f 现在我明白第一个
  • java中的Ludo游戏板[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何在不使用数组的情况下向该板编写代码 我尝试过 但没有得到正确的结果 它应该包含函数 循环和条件结构 行 11 列 11 public static void board in
  • 注意动态添加的类

    如果将类动态添加到元素 是否有一个侦听器可以在其中监视和运行代码 我使用 WordPress CMS 和一个插件 我正在使用我们动态添加一个类 我想在发生这种情况时捕捉到并运行一些自定义代码 更改 onChange 似乎不起作用 test
  • 为什么 Firefox 的最小宽度为 615px?

    我对媒体查询非常陌生 所以我在 Firefox 12 0 上使用 min width 属性 发现它不起作用 经过一番尝试和尝试这个可爱的网站之后 http barrow io lab media query viewport 我发现我的 F
  • 如何使用 PHP 向网页发出请求?

    我想要实现的是 第一 我想查询像谷歌这样的页面 但不填写手动提交的搜索 第二 我想获取结果并将其保存到数据库中 我在这里看到了使用 C 执行此操作的示例 http www farooqazam net c sharp auto click
  • 如何追踪IOS5的崩溃情况?

    我是IOS开发新手 我发生了崩溃 但它没有在我的程序中显示崩溃位置 有没有办法在 IOS 5 1 中显示崩溃位置 谢谢 None
  • 如何在C#中将数字拆分为单独的数字? [复制]

    这个问题在这里已经有答案了 说我有12345 我想要每个号码的单独项目 一个字符串甚至一个单独的数字都可以 Split 方法是否对此有重载 我会使用模数和循环 int GetIntArray int num List
  • Scipy ndimage 形态学运算符使我的计算机内存 RAM (8GB) 饱和

    我需要使用半径为 17 或更大的 3D 结构元素来计算形状为 400 401 401 大小为 64320400 字节的 3D 数组的形态开口 结构体元素ndarray的大小为 42875 字节 使用scipy ndimage morphol
  • 使用 ExtJS 获取响应文件

    我使用 ExtJS 为我的程序构建客户端 有一种情况 我想向服务器发送 Ajax 请求 并获取响应文件 二进制文件 而不是纯文本文件 即 XLS 或 PDF 我如何获取 ExtJS 返回的文件 我的意思是该文件可以下载并存储到客户端 我无法
  • SQL 字符串:计算字符串内的单词数

    我在这里搜索了许多问题 但我发现的所有正确答案都是针对不同的语言 如 Javascript 等 我在 SQL 中有一个简单的任务 但我似乎找不到简单的方法来完成 我只需要计算 SQL 字符串 一个句子 内的 单词 数量 您可以在我的示例中看
  • OpenCV 错误 - Core.hpp 标头必须编译为 C++

    我努力了Core hpp Base hpp header must be compiled as C 错误 我将 BITCODE 设置为NO import
  • 当子类化 DBI 时,Perl DBI 将设置 SQLite DB cache_size 视为写入操作

    我有一个 Perl 程序 在过去两年里我们每天都成功运行 但今天崩溃并显示错误消息 致命错误 无法执行 PRAGMA cache size 1000000 尝试写入只读数据库 有问题的 SQLite 数据库是只读的 并且一直都是 并且代码始