2011-02-10 50 views
1

我正在切换一个rails 3.0.3应用程序的数据库我已经从 postgres开发到MySQL,这样我就可以利用亚马逊的RDS 。在我制作 之前,我一直使用mysql在我的dev 机器上运行我的测试代码,并使用mysql2适配器。我的测试代码正在抛出一些我还没有完全弄到底的错误。 基本上我有一个模型,用于存储大型XML上载。我 测试代码看起来是这样的从postgres迁移到mysql导致奇怪的错误Mysql2 ::错误:MySQL服务器已经消失

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的工作,我必须设置:限制 变量,以便使用LONGTEXT而不是标准文本 字段。这些文件可以是相当大的,但是当我测试使用小文件 没有问题

我可以完全找错了树,但我怀疑 问题可能是由数据库连接导致的被丢弃基于 上当我在开发 模式下尝试上传文件时,引发的错误。我做了一些检查这个错误,我不知道什么可能会丢弃连接,该文件不需要8小时(默认连接下降时间)插入

Mysql2 ::错误:MySQL服务器已经消失客户:INSERT INTO xml_uploads ........

我的database.yaml设置如下。

test: 
    adapter: mysql2 
    encoding: utf8 
    reconnect: true 
    database: app_test 
    username: username 
    password: password 
    host: localhost 

没有人有任何线索的问题是什么,以及如何 固定?任何帮助,这将不胜感激。

+0

康纳尔一些信息,我以前也有这个问题,几年前与Java和我无法正确记住问题所在。但我记得我们正在重载服务器(可能事务对于服务器来说太大了),并且它停止响应那个“服务器已经消失”的消息。你有没有用小数据集来试试这个?或一个小文件? – Augusto 2011-02-10 11:57:37

回答

3

我决定在S3中存储数据,但是朋友确实指出了我对这个问题的解决方案,我测试了它并且工作,所以我认为我应该在这里发布它以防万一否则会遇到同样的问题。

基本上这个问题是由于max_allowed_pa​​cket变量被设置为小于博客/文本字段大小所引起的。该查询无法执行,因此连接被取消。以下是有关max_allowed_pa​​cket的变量

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_allowed_packet

,还有一些细节上的调整它的RDS实例

http://www.henrybaxter.ca/?p=111