【发布时间】:2011-06-24 18:38:52
【问题描述】:
我正在切换我开发的 rails 3.0.3 应用程序的数据库 postgres 到 mysql,这样我就可以利用亚马逊的 rds。在我做之前 我在开发人员上使用 mysql 运行测试代码的变化 带有 mysql2 适配器的机器。我的测试代码抛出了一些 我还没有完全弄清楚的错误。 基本上我有一个用于存储大型 xml 上传的模型。我的 测试代码看起来像这样
test "xml upload for large file" do
file = File.new("test/files/lib/upload_sample.xml")
upload = XmlUpload.create(:xml_contents => contents = file.read)
.....
.....
end
创建行抛出以下错误
ActiveRecord::StatementInvalid: Mysql2::Error: SAVEPOINT active_record_1 does not exist: ROLLBACK TO SAVEPOINT active_record_1
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract_adapter.rb:202:in `rescue in log'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract_adapter.rb:194:in `log'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/mysql2-0.2.6/lib/ active_record/connection_adapters/mysql2_adapter.rb:314:in `execute'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/mysql2-0.2.6/lib/ active_record/connection_adapters/mysql2_adapter.rb:358:in `rollback_to_savepoint'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract/database_statements.rb: 149:in `rescue in transaction'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/connection_adapters/abstract/database_statements.rb: 127:in `transaction'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:204:in `transaction'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:287:in `with_transaction_returning_status'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:237:in `block in save'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:248:in `rollback_active_record_state!'
/Users/conor/.rvm/gems/ruby-1.9.2-p136/gems/activerecord-3.0.3/lib/ active_record/transactions.rb:236:in `save'
....
我一直将文件内容存储在文本字段中。我意识到 我应该认真考虑将文件存储在 s3 中,但这是 我目前的设置。在 postgres 中一切正常 但为了让事情与 mysql 一起工作,我必须设置 :limit 变量,以便使用 LONGTEXT 而不是标准文本 场地。文件可能很大,但是当我使用小文件进行测试时 没有问题
我可能完全找错了树,但我怀疑 问题可能是由于数据库连接被丢弃引起的 关于我尝试在开发中上传文件时引发的错误 模式。我对此错误进行了一些检查,但我不确定是什么导致了连接断开,插入文件不需要 8 小时(默认连接断开时间)
Mysql2::Error: MySQL server has gone away: INSERT INTO xml_uploads ........
我的 database.yaml 设置如下。
test:
adapter: mysql2
encoding: utf8
reconnect: true
database: app_test
username: username
password: password
host: localhost
有没有人知道问题是什么以及如何解决 固定的?对此的任何帮助将不胜感激。
【问题讨论】:
-
Conor,几年前我曾经在使用 java 时遇到过这个问题,但我记不清是什么问题了。但我记得我们正在使服务器超载(也许事务对于服务器来说太大了)并且它停止响应“服务器已消失”的消息。你用一个小数据集试过这个吗?还是一个小文件?
-
您好 Augusto,感谢您的回复。我已经尝试使用小文件进行测试,并且一切运行顺利,但是使用代表可以上传的数据类型的测试文件失败了。这些文件很大(1.5-2.5mb),但并不疯狂。我认为连接超时并在插入之前被丢弃,但我不确定为什么会这样
-
尝试在 mysql 中设置一个非常大的超时 - 详细信息可以在这里找到 - dev.mysql.com/doc/refman/5.0/en/gone-away.html
-
嗨 ajeal,感谢您的回复。我也看了一下,并尝试使用 timeout 变量。默认值为 28800 秒(8 小时),所以我猜测是其他原因导致了问题,但我不确定是什么。我还在我的 rails 应用程序中使用了默认设置,但我仍然没有任何运气
标签: mysql ruby-on-rails ruby-on-rails-3 migration