gpt4 book ai didi

mysql - 测试时如何让 Rails 4.x streaming 与 MySQL 一起工作?

转载 作者:行者123 更新时间:2023-11-29 03:31:45 24 4
gpt4 key购买 nike

我创建了一个新的 Rails 4.2.1 测试项目来试用新的流媒体功能(我读到的关于 here 的“实时”功能)。该项目设置为使用 MySQL 作为数据库(我也尝试过 Sqlite 但无法重现该问题)。该项目很简单,仅包含:1) 模型 Test具有 2 个属性(两个字符串)。 2)一条简单的路线resources :tests和 3) 一个简单的 Controller tests_controller一次操作 index .模型和 Controller 由标准的rails生成器生成,只修改了 Controller ,如下:

class TestsController < ApplicationController
include ActionController::Live

def index
response.headers['Content-Type'] = 'application/json'
response.stream.write('{"count": 5, "tests": [')
Test.find_each do |test|
response.stream.write(test.to_json)
response.stream.write(',')
end
response.stream.write(']}')
response.stream.close
end
end

当我运行 rails s并用手测试一切似乎都很好。但是当我添加一个测试(如下所示)时,我得到了一个奇怪的错误:

1) Error:
TestsControllerTest#test_index:
ActiveRecord::StatementInvalid: Mysql2::Error: This connection is in use by: #<Thread:0x007f862a4a7e48@/Users/xxx/.rvm/gems/ruby-2.2.2/gems/actionpack-4.2.1/lib/action_controller/metal/live.rb:269 sleep>: ROLLBACK

测试是:

require 'test_helper'

class TestsControllerTest < ActionController::TestCase
test "index" do
@request.headers['Accept'] = 'application/json'
get :index
assert_response :success
end
end

请注意,错误是间歇性的,只有大约一半的时间出现。此外,尽管手动测试不会导致任何错误,但我担心当多个客户端同时访问 API 时会发生错误。对于这里发生的事情的任何建议,我们将不胜感激。

最佳答案

很老了,但是您实际上需要 checkout 新的数据库连接,因为 ActionController::Live 在新线程中执行操作:

The final caveat is that your actions are executed in a separate thread than the main thread. Make sure your actions are thread safe, and this shouldn't be a problem (don't share state across threads, etc).

https://github.com/rails/rails/blob/861b70e92f4a1fc0e465ffcf2ee62680519c8f6f/actionpack/lib/action_controller/metal/live.rb

您甚至可以为此使用 around_filter/around_action

关于mysql - 测试时如何让 Rails 4.x streaming 与 MySQL 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com