带有拼写修复1扩展的SQLite与第二个查询时实体框架核心崩溃一起使用

2023-12-31

相关剥离项目

https://github.com/djon2003/mediarecognizer-spellfix1 https://github.com/djon2003/mediarecognizer-spellfix1

导入部分已被删除,并且我肯定没有包含 5 GB 的数据库。

Issue

我按照说明编译了pellfix1扩展,它正在工作......好吧,不是第二个查询。

我使用名为“DB Browser for SQLite”的外部软件进行测试,加载我编译的扩展并手动运行查询。没有任何问题。

此链接为您提供了崩溃的确切行。 https://github.com/djon2003/mediarecognizer-spellfix1/blob/069dea3495402a5ab853986fbc05038201c197ce/MediaRecognizer/MediaRecognizer.cs#L96

正如你所看到的...

  • 第一个测试:在没有 SQLite 扩展的情况下检索两个不同的实体 => 它有效。
  • 第二个测试:使用pellfix1检索一个实体与另一个“使用数据库”=>它有效
  • 第三个测试:使用spellfix1在同一“使用数据库”中检索另一个实体=>失败。 (评论)
  • 第四个测试:(不包括)在同一“使用数据库”中使用pellfix1的实体之后检索一个没有spellfix1的实体=>失败。
  • 第五个测试:在另一个“使用数据库”中检索两个不同的实体,而不使用 SQLite 扩展 => 它可以工作。
  • 第六个测试:使用spellfix1在另一个“使用数据库”中检索另一个实体=>失败。

我每次遇到的错误是:Microsoft.Data.Sqlite.SqliteException: 'SQLite Error 1: 'error during initialization: '.'

我找不到任何相关信息。下一步是直接查看扩展代码或 SQLite 代码本身。

EDIT

详细信息:通过返回修改 SQLite 扩展SQLITE_OK_LOAD_PERMANENTLY代替SQLITE_OK扩展初始化修复了该错误。不过,这只是一个补丁。


我不太了解 SQLite 的工作原理以及 EF 应如何与其正确通信,因此我不能说这是一个错误还是预期的行为,但无论如何,下面是发生错误的原因。

您看到该异常是因为 EF Core 尝试加载扩展两次或更多次。根据文档https://www.sqlite.org/loadext.html#implementation_details https://www.sqlite.org/loadext.html#implementation_details(参见 5. 持久可加载扩展):

可加载扩展的默认行为是,当最初调用的数据库连接关闭时,它会从进程内存中卸载。sqlite3_load_extension() closes.

但我们也知道 EF Core 实现了连接池,这意味着使用相同的连接字符串,框架将尝试使用池中的连接,当您完成查询时,它会将连接返回到池中。这意味着它不卸载查询完成时的扩展只是因为连接未关闭。

最重要的是,只有物理连接被池化,但是一个对象SqliteConnection类型是某种逻辑连接,实际上它是物理连接的抽象。

逻辑连接怎么样(SqliteConnection)。实际上是一个新的实例SqliteConnection是用每个创建的DbContext您创建的实例,它完全由 EF Core 管理。 EF Core 似乎在对数据库的每个请求上打开/关闭此逻辑连接(note打开/关闭此连接是非常轻量级的操作,因为它不是物理连接,并且实际的物理连接是从池中获取的)。并且 EF Core 会在每次调用时发送请求来加载请求的扩展Open.

那么让我们回到您的代码示例,看看发生了什么。

相同上下文的多个请求

using (var db = new Context())
{
  var connection = (SqliteConnection)db.Database.GetDbConnection();
  connecton.EnableExtensions(true);
  conn.LoadExtension(@"SQLite Extensions\spellfix1.dll");

  db.Models.FromSqlRaw(SOME QUERY).ToList();
  db.Models.FromSqlRaw(SOMEQUERY).ToList(); // (1) will throw here
}

这会引发 (1),因为您只有一个实例SqliteConnection并两次致电Open方法(每个请求一个)发送加载扩展的请求。因此,第二次调用将尝试第二次加载扩展并抛出异常。

两个请求各有其自己的上下文

using (var db = new Context())
{
  var connection = (SqliteConnection)db.Database.GetDbConnection();
  connecton.EnableExtensions(true);
  conn.LoadExtension(@"SQLite Extensions\spellfix1.dll");

  db.Models.FromSqlRaw(SOME QUERY).ToList();
}

using (var db = new Context())
{
  var connection = (SqliteConnection)db.Database.GetDbConnection();
  connecton.EnableExtensions(true);
  conn.LoadExtension(@"SQLite Extensions\spellfix1.dll");

  db.Models.FromSqlRaw(SOME QUERY).ToList(); // (1) throws here
}

这会抛出(1)因为物理连接用于加载第一个扩展using仍然打开,这意味着在我们再次加载扩展之前尚未卸载它(1).

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

带有拼写修复1扩展的SQLite与第二个查询时实体框架核心崩溃一起使用 的相关文章

  • 为什么我应该使用内联代码? [复制]

    这个问题在这里已经有答案了 我是一名 C C 开发人员 这里有几个始终困扰我的问题 常规 代码和内联代码之间有很大区别吗 主要区别是什么 内联代码只是宏的一种 形式 吗 选择内联代码时必须进行什么样的权衡 Thanks 表现 正如之前的答案
  • 是否保证 sizeof(T[N]) == N * sizeof(T) ?

    我一直假设 N 个元素类型的数组的大小T 由返回sizeof保证正好是N次sizeof T The 对这个问题的评论 https stackoverflow com questions 46457449 is it always the c
  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • 线程独占数据:如何存储和访问?

    NET 中是否有可能将对象实例绑定到线程的当前执行上下文 这样在代码的任何部分我都可以做类似的事情CurrentThread MyObjectData DoOperation 并确保我访问特定于线程的数据 谢谢 你可以看一下线程静态属性 h
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 错误:“运行所选代码生成器时出错:包恢复失败”

    我正在尝试将控制器添加到 ASP NET Core 项目中的解决方案中 当我尝试这样做时 我收到此错误 我收到相同的消息 为控制器添加最小依赖项和完整依赖项 我也有这个问题 使用实体框架添加控制器 gt 带有操作的 API 控制器 将给出
  • 提取单花括号内的值

    我想要一个收藏 value 一个字符串使用正则表达式 例如 lorem ipsum field1 lorem ipsum field2 lorem ipsum field1 lorem ipsum field2 field3 我会得到 fi
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A

随机推荐

  • 具有多个原型单元的 TableView

    我有一个关于具有 3 种不同类型的原型单元的表格视图的简单问题 前两个仅出现一次 而第三个则出现 4 次 现在我感到困惑的是如何在 cellforRowatindexpath 中指定哪个单元格原型用于哪一行 所以 我想要类似对于第 0 行
  • dlopen() 是否设置 errno?

    一切都在标题中 手册页没有说明任何内容 一些谷歌报告有些人在 dlopen 之后检查 errno 但只有很少的人并且结果各不相同 该函数确实返回一个成功 不成功值 但是应该如何找出失败的原因 So does dlopen 设置错误号 那么不
  • 如何使用 Netbeans 7.2 和 Maven 设置系统属性?

    我正在 NetBeans 7 2 中运行单元测试 使用 Maven 如何设置系统属性 我尝试使用以下方法添加属性 项目属性 gt 运行 gt JVM 参数 但这没有什么区别 我认为这可能与 JUnit 在不同的 JVM 中运行或其他什么有关
  • 在linux中,如何通过GNU ARM汇编进行系统调用

    到目前为止 我只知道如何通过 gnu arm 汇编退出程序 exit 0 mov r0 0 return code mov r7 1 supervisor service number svc call supervisor service
  • 使用 linq 和 NHibernate 3.0 进行分组

    据我所知 group by 只在 NHibernate 3 0 中添加 但即使使用版本 3 我也无法让 group by 工作 我尝试执行以下查询 Session Query GroupBy gbftr gt gbftr Tag Order
  • gevent (py)wsgi 优雅关闭

    我知道 通过搜索和检查 gevent 的源代码 优雅地关闭基于 gevent WSGI 的服务器的唯一方法是 server gevent wsgi WSGIServer 80 someWSGIApp def shutdown print S
  • JPA为什么使用createNamedQuery

    我正在将 DAO 层从使用 Hibernate API 更改为使用纯 JPA API 实现 看起来推荐的方法是使用实 体管理器中的 createNamedQuery 命名查询存储在模型 实体类的注释中 这对我来说没有意义 为什么要在模型对象
  • 使用 Testcontainers 时如何设置 Postgresql 的端口?

    有时我需要安装一个端口PostgreSQL 我在容器中运行它进行测试 但测试容器开发者命令Testcontainers删除了这个功能 但在某个地方有一个解决方案 通过设置 但我找不到它 谁有关于如何做到这一点的任何想法或信息 public
  • 如何在 MockMvc 中比较两个 jsonPath 值

    我正在使用 MockMvc 为我的 Spring 应用程序编写测试 假设我的 json 结果将具有以下格式 available true location ID 1 path local1 ID 2 path local2 ID 3 pat
  • 在Python中读取SUB之外的行[重复]

    这个问题在这里已经有答案了 新手问题 在 Python 2 7 2 中 我在读取文本文件时遇到问题 这些文件似乎意外包含一些控制字符 具体来说 循环 for line in f 一旦遇到包含以下内容的行就会停止 没有任何警告或错误SUB字符
  • XMLParser 和 SimpleXML 哪个更快

    你们觉得怎么样 我目前在整个项目中使用 SimpleXML 其平均内存使用量为 250KB 每次执行处理时间为 500 微秒 我只是打算切换到 XMLParser 非常感谢您的建议 编辑 实际微时间是 0 000578 微秒 我只是对毫和微
  • ZeroMQ (clrzmq4) 轮询问题

    我想要完成的是实现从两个套接字之一读取消息 无论消息首先到达何处 据我了解轮询 zmq poll 是正确的做法 如指南中的 mspoller http zguide zeromq org cs mspoller 在这里我将提供小的伪代码片段
  • Android datarouter logcat错误消息

    所以我的 logcat 被这个 datarouter 错误发送了垃圾邮件 任何人都可以帮助我解决这个问题并告诉我为什么会发生这种情况 哦 我尝试过重新启动手机和 eclipse 编辑 这似乎主要发生在我的 Mac 工作计算机上 以下是每 3
  • iOS 6 方向问题

    我有一个应用程序 通常是一个纵向应用程序 只显示一个 UIViewController 的横向视图 在新的 iOS 6 发布之前它都可以正常工作 我真的不明白方向在 iOS 6 中是如何工作的 所以我写了一个测试应用程序 这是我所做的 设置
  • 硒测试无法与任何元素相互作用

    所以我知道当我将 Django 设置中的 DEBUG 设置为 False 时 Selenium 无法访问静态文件 导致如下所示 但是 当我运行 Selenium 测试时 无论它们都能够与 DOM 交互并从下拉列表中选择项目 我目前拥有的测试
  • PPL - 如何配置本机线程数?

    我正在尝试使用 PPL 来管理本机线程的数量Scheduler类 这是我的代码 for int i 0 i lt 2000 i configure concurrency count 16 to 32 concurrency Schedul
  • 从 jruby-complete 消耗宝石

    我可以让我的jruby complete消耗传递给它的罐子中的宝石 但我想使用中央宝石库 这就是我现在可以做的 java jar jruby complete 1 6 5 jar S gem list LOCAL GEMS rake 0 8
  • 如何使用 Greasemonkey 代码替换 Head 脚本

    我想将 script js 替换为 demo js 有人请帮助我 尽早运行您的脚本 run at document start 添加事件监听器beforescriptexecute并检查脚本源 当您检测到所需的脚本时 调用preventDe
  • legend.only=T 时的图例属性(栅格包)

    仅绘制图例时 raster对象 颜色条 require raster r raster r 1 plot r legend F plot r zlim c 10 10 legend only T 如何控制图例轴标签大小 刻度长度和其他图例属
  • 带有拼写修复1扩展的SQLite与第二个查询时实体框架核心崩溃一起使用

    相关剥离项目 https github com djon2003 mediarecognizer spellfix1 https github com djon2003 mediarecognizer spellfix1 导入部分已被删除