首页 / 知识
关于ruby on rails:SQLite3 :: BusyException
2023-04-16 07:44:00

SQLite3::BusyException现在使用SQLite3运行Rails站点。 大约每500个请求一次,我得到一个 ActiveRecord :: StatementInvalid(SQLite3 :: BusyException:数据库已锁定:... 有什么办法可以解决这种对我的代码造成最小影响的问题? 目前,我正在使用SQLLite,因为您可以将数据库存储在源代码管理中,这使备份自然而又可以很快地将更改推出。 但是,显然并没有为并发访问设置它。 我明天早上将迁移到MySQL。 您提到这是一个Rails网站。 Rails允许您在database.yml配置文件中设置SQLite重试超时:
超时值以毫秒为单位指定。将其增加到10或15秒应该会减少您在日志中看到的BusyExceptions的数量。 不过,这只是一个临时解决方案。如果您的站点需要真正的并发,那么您将不得不迁移到另一个数据库引擎。 默认情况下,如果数据库处于忙碌状态且已锁定,则sqlite立即返回一个阻塞的,忙碌的错误。您可以要求它等待并继续尝试一段时间,然后再放弃。通常,这可以解决问题,除非您确实有数千个线程在访问您的数据库,否则我认为sqlite是不合适的。
所有这些事情都是正确的,但是并不能解决问题,这很可能是:为什么我的Rails应用偶尔会在生产中引发SQLite3 :: BusyException? @Shalmanese:生产托管环境是什么样的?它在共享主机上吗? NFS共享上是否包含sqlite数据库的目录? (就像在共享主机上一样)。 此问题可能与NFS共享的文件锁定现象以及SQLite缺乏并发现象有关。
它为我工作,它将重置并显示挂起的迁移。 如果您遇到此问题,但增加超时并没有任何改变,则可能是事务还有另一个并发问题,总结如下:
解决此问题的一种方法是在事务开始时修补
在此处阅读更多信息:https://rails.lighthouseapp.com/projects/8994/tickets/5941-sqlite3busyexceptions-are-raised-immediately-in-some-cases-despite-setting-sqlite3_busy_timeout 仅作记录。在一个使用Rails 2.3.8的应用程序中,我们发现Rails忽略了Rifkin Habsburg建议的"超时"选项。 经过更多调查后,我们在Rails开发中发现了一个可能相关的错误:http://dev.rubyonrails.org/ticket/8811。经过更多调查后,我们找到了解决方案(在Rails 2.3.8中进行了测试): 编辑此ActiveRecord文件:activerecord-2.3.8 / lib / active_record / connection_adapters / sqlite_adapter.rb 替换为:
与
就这样!我们还没有注意到性能下降,现在该应用程序支持更多请愿书而不会中断(它等待超时)。 Sqlite很好!
我对rake db:migrate有类似的问题。问题是工作目录在SMB共享上。 大多数答案是针对Rails而不是原始红宝石,OP质疑IS是否适用于Rails,这很好。 :) 因此,如果任何原始红宝石用户遇到此问题,并且不使用yml配置,我只想将此解决方案留在这里。 实例化连接后,可以按以下方式进行设置:
Sqlite可以允许其他进程等到当前进程完成。 当我知道可能有多个进程试图访问Sqlite DB时,我使用这条线进行连接: conn = sqlite3.connect('文件名',Isolation_level ='独占') 根据Python Sqlite文档:
我在sqlite3 ruby??扩展上发现了一个死锁,并在此处进行了修复:试一试,看看是否可以解决您的问题。
我打开了一个拉取请求,不再有任何回应。 无论如何,如sqlite3本身所描述的,可能会遇到一些繁忙的异常。 请注意以下情况:sqlite忙
如果满足此条件,则超时不再有效。为了避免这种情况,请不要在开始/提交中放入选择。或使用排他锁进行开始/提交。 希望这可以帮助。 :) 这通常是多个进程访问同一数据库的连续错误,即,如果在RubyMine中未设置"只允许一个实例"标志 尝试运行以下命令,可能会有所帮助:
来自:Ruby:SQLite3 :: BusyException:数据库被锁定: 这可以清除任何阻碍系统的交易 啊-过去一周我生存的祸根。当任何进程写入数据库时??,Sqlite3都会锁定db文件。 IE进行任何UPDATE / INSERT类型的查询(出于某种原因也请选择count(*))。但是,它可以处理多次读取。 因此,我终于感到沮丧,无法在数据库调用周围编写自己的线程锁定代码。通过确保应用程序在任何时候只能有一个线程写入数据库,我能够扩展到1000个线程。 是的,它慢得要命。但是它也足够快且正确,这是一个不错的属性。 遇到锁定时正在访问哪个表? 您有长期交易吗? 您能找出遇到锁定时仍在处理哪些请求吗? 来源:此链接
我相信这会在交易超时时发生。您确实应该使用"真实"数据库。像Drizzle或MySQL。为什么您比之前的两个选项更喜欢SQLite? |
最新内容
相关内容
linux运行图形界命令?
linux运行图形界命令?,系统,密码,地址,电脑,图形界面,地方,工具,界面,终端,图形,linux图形化界面命令第一种方式比较简单,只需要选择相应的带图linux怎样运行命令?
linux怎样运行命令?,系统,工作,信息,基础,地址,命令,目录,工具,密码,一致,Linux系统基础操作指令1、linux常用命令有pwd命令、cd命令、ls命令linux操作数据库命令?
linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参数,如何实现MySQL数据库的基本用法在linux下1、mysql all-databaselinux下载数据命令?
linux下载数据命令?,软件,工具,数据,系统,代理,官网,网络,名称,网址,盘中,在linux下如何下载svn上的文件?1、首先,打开linux,进入主界面,然后在主linux编译完运行命令?
linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,在linux中编译C输入完程序后输入个:wq然后按什么键就然后就回到了linux命令程序运行?
linux命令程序运行?,状态,系统,服务,情况,命令,进程,软件,数据,发行,时间,Linux中如何启动进程?进程调度命令有哪些?实现调度启动进程的方法有linux运行脚本命令?
linux运行脚本命令?,系统,代码,服务,文件,工具,平台,网站,脚本,命令,方法,Linux配置开机自启动执行脚本有哪些方法方法1:执行ntsysv命令,然后在做数据linux常用命令?
做数据linux常用命令?,工作,系统,基础,网络,数据,标准,管理,工具,地址,命令,linux运维常用命令Curl命令用法 curl语法和参数选项 # curl [optlinux命令后加运行?
linux命令后加运行?,状态,暂停,工具,单位,进程,环境,网络,系统,权威,第一,mv什么意思呢?1、MV就是音乐短片(Music Video),是指与音乐(通常大部分是ssh运行linux命令?
ssh运行linux命令?,地址,服务,系统,软件,工具,电脑,网络,密码,名称,命令,在linux命令中登陆ssh服务的命令是?步骤如下:查询\安装SSH服务 (1)登陆linux查重复数据命令?
linux查重复数据命令?,工具,数据,系统,电脑,名字,资料,代码,百度,标准,技术,利用Linux命令行进行文本按行去重并按重复次数排序1、输入文件 指linux运行多个命令?
linux运行多个命令?,环境,软件,系统,工作,服务,连续,命令,指令,分号,冲突,linux多个用户同时执行命令会冲突吗不会冲突。解释:用户登录linux的