当子类化 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 视为写入操作 的相关文章

  • Blue Dragon Coldfusion 服务器缓存问题

    我有一个在 ColdFusion MVC 框架 Mach II 中构建的应用程序 并托管在蓝龙 ColdFusion 服务器上 它会导致缓存问题 当我添加一个包含一些内容的新页面并加载该页面时 它工作正常 但是 当我在同一个文件中进行一些更
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 如何从 R 运行带有特定模块的 perl 脚本?

    我可以从终端运行 perl 脚本 myperlscript pl 没有任何问题 但是 如果我尝试从 RStudio 中运行相同的 perl 脚本 则会出现以下错误 command lt myperlscript pl outputfile
  • 插入多行并返回主键时 Sqlalchemy 的奇怪行为

    插入多行并返回主键时 我注意到一些奇怪的事情 如果我在 isert 查询中添加使用参数值 我会得到预期的行为 但是当将值传递给游标时 不会返回任何内容 这可能是一个错误还是我误解了什么 我的sqlachemy版本是0 9 4 下面如何重现错
  • SQLite - 左连接

    我需要进行这样的查询 SELECT table1 table2 column FROM table1 LEFT JOIN table2 ON table1 column table2 column 但这不起作用 如果我尝试相同的查询但替换第
  • 迭代哈希数组

    我编写了下面的例程 迭代哈希值 0 7 并打印出每个哈希值中特定键的值 我需要获取每个哈希中 b4 的值 我想取消 0 7 当存在不同数量的哈希值时使用更智能的东西 例如 有时只有 2 个 也可能有 160 个 my out decode
  • sql查询将两列与一列连接起来

    我在 MS Access 2010 中有 2 个表 如下所示 USERS u id u name LOAN l id l from ref users u id l to ref users u id l amount Users u id
  • 如何在 sqlalchemy 中创建基于文字的查询?

    我创建了一个函数来创建表达式 def test operator1 operation operator2 return literal column operator1 op operation operator2 现在当我用 test
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • SPARK SQL - 当时的情况

    我是 SPARK SQL 的新手 SPARK SQL 中是否有相当于 CASE WHEN CONDITION THEN 0 ELSE 1 END 的内容 select case when 1 1 then 1 else 0 end from
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA
  • SQLite HAVING 比较错误

    我有一个测试 SQLite 表 用于存储带有值的报告数据 CREATE TABLE IF NOT EXISTS test fact daily revenue date TEXT revenue NUMERIC product TEXT I
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 如何在使用连接池时强制 SqlConnection 物理关闭?

    我明白 如果我实例化一个 SqlConnection 对象 我实际上是从连接池中获取一个连接 当我调用 Open 时 它将打开连接 如果我对该 SqlConnection 对象调用 Close 或 Dispose 方法 它将返回到连接池 但
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 如何在 SQLite 中将时间戳转换为字符串?

    我有一个表 其中存储了时间戳 以毫秒为单位 我想将这些时间戳转换为人类可读的形式 这是我的表的输出示例 SELECT date raw strftime d m Y date 1000 as string FROM my table raw
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和

随机推荐

  • 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 数据库是只读的 并且一直都是 并且代码始