php小编香蕉为你带来关于SQLite中间歇性表丢失错误的解决方法。当我们使用SQLite数据库时,可能会遇到内存错误或者表丢失的情况。这种错误通常是由于不正确的数据库操作或者内存问题引起的。为了解决这个问题,我们可以采取一些措施,如优化查询语句、增加内存限制等。在本文中,我们将详细介绍如何排查和解决这个问题,以确保数据库的正常运行。
问题内容
我们通过 github.com/mattn/go-sqlite3 v1.14.16 在 Go 中使用 SQLite 3.39.4。连接字符串为 ":memory:?cache=shared&mode=rwc&_mutex=no&_journal=WAL&_sync=NORMAL"
我们偶尔会在测试中看到错误“没有这样的表:配置”。令人困惑的是,有问题的查询已经在测试用例中成功使用,并且该表随后显示在 sqlite_master 的查询中,无论是在数据库连接还是引发错误的事务对象中。但是,一旦发生错误,查询就不会再成功。
我意识到这是一个相当模糊的问题,但有人至少可以建议去哪里看吗?数据库连接始终具有相同的指针值。
更新:
第二次尝试时,我几乎可以在此 SSCCE 中重现问题:
package main import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" "os" ) func main() { os.Remove("example.db") db, err := sql.Open("sqlite3", ":memory:") if err != nil { panic(err) } for _, s := range []string{ "CREATE TABLE if not exists Configuration (" + "`id` varchar(1024) NOT NULL," + "`body` varchar(10240) DEFAULT NULL, " + "PRIMARY KEY (id) " + ")", "INSERT INTO Configuration (id, body) VALUES ('some-unique-value', 'another-unique-value')", } { _, err = db.Exec(s) if err != nil { panic(err) } } for i := 0; i < 10; i++ { tx, err := db.Begin() if err != nil { panic(err) } q, err := tx.Prepare("select Configuration.id, Configuration.body \n\t\t\tfrom Configuration\n\t\t\tWHERE Configuration.id = ? ") fmt.Println(i, err) if q != nil { _ = q.Close() } fmt.Println("tx:") showTables(tx) fmt.Println("db:") showTables(db) tx.Commit() } } func showTables(db interface { Query(query string, args ...interface{}) (*sql.Rows, error) }) { r, err := db.Query("SELECT name FROM sqlite_master") if err != nil { panic(err) } for r.Next() { var name string _ = r.Scan(&name) fmt.Println(name) } }
它与实际问题不同,因为 showTables 不显示 SSCCE 中的表,但在实际测试中显示。此示例显示使用 :memory:
而不是 example.db
的问题,但前提是事务未关闭。这是内存数据库已知的或预期的行为吗?:memory:
而不是 example.db
的问题,但前提是事务未关闭。这是内存数据库已知的或预期的行为吗?
解决方法
Go database/sql
隐式使用连接池,但 :memory:
解决方法Go database/sql
隐式使用连接池,但 :memory:
数据库默认是打开它们的连接的私有
https://www.php.cn/link/d346256ad566cf97801e5cecc45a2557
cache=shared
,正如您所尝试的那样。但 SQLite 要求将其指定为 URI:file::memory:?cache=shared
(file:
由于在幕后创建/关闭多个 SQLite 连接,因此您并不真正知道哪个连接正在运行每个语句以及针对哪个数据库,因此很自然,某些连接可以看到某些数据,而其他连接则看不到。
共享连接的一种方法是使用
很重要)。- 打开共享内存数据库的更可靠方法是:
file:memdb1?mode=memory&cache=shared
(命名为memdb1
-
file:/memdb1?vfs=memdb
(命名为/memdb1
,并使用memdb
)
VFS)
🎜 🎜您的其他参数可能是不必要的,甚至可能有害(对于内存数据库)。🎜以上是SQLite 中间歇性表丢失错误:内存:数据库的详细内容。更多信息请关注PHP中文网其他相关文章!

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

本文演示了创建模拟和存根进行单元测试。 它强调使用接口,提供模拟实现的示例,并讨论最佳实践,例如保持模拟集中并使用断言库。 文章

本文探讨了GO的仿制药自定义类型约束。 它详细介绍了界面如何定义通用功能的最低类型要求,从而改善了类型的安全性和代码可重复使用性。 本文还讨论了局限性和最佳实践

本文讨论了GO的反思软件包,用于运行时操作代码,对序列化,通用编程等有益。它警告性能成本,例如较慢的执行和更高的内存使用,建议明智的使用和最佳

本文讨论了GO中使用表驱动的测试,该方法使用测试用例表来测试具有多个输入和结果的功能。它突出了诸如提高的可读性,降低重复,可伸缩性,一致性和A

本文使用跟踪工具探讨了GO应用程序执行流。 它讨论了手册和自动仪器技术,比较诸如Jaeger,Zipkin和Opentelemetry之类的工具,并突出显示有效的数据可视化


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。