小编Kri*_*sta的帖子

ActiveRecord :: ConnectionTimeoutError偶尔发生

每当我有一个使用ActiveRecord的应用程序时,我得到这个ConnectionTimeoutError - 但总是在一段未知的时间之后

ActiveRecord::ConnectionTimeoutError (could not obtain a database connection within 5 seconds.  The max pool size is currently 30; consider increasing it.):
Run Code Online (Sandbox Code Playgroud)

它之前设置为5,我们已经增加了它,并且它无法同时使用30个连接.我们使用ActiveRecord的唯一方法是我们的​​会话存储.

我们的database.yml文件如下所示:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 30
  timeout: 5000
Run Code Online (Sandbox Code Playgroud)

(测试和生产设置相同)


我一直在谷歌搜索这个事件,刚刚发现这个帖子:

https://groups.google.com/forum/#!msg/copenhagen-ruby-user-group/GEHgi_WudmM/gnCiwWqmVfMJ

哪个提到ActiveRecord一旦完成就不会检查连接回池?真的吗?我是否需要手动管理连接?

我很感激任何建议!!

编辑我应该提一下我正在运行Rails 3.1.3

activerecord database-connection ruby-on-rails connection-timeout ruby-on-rails-3.1

20
推荐指数
1
解决办法
1万
查看次数

Rails 3.2 - ActiveResource - 使用POST/PUT和JSON

我一直在看这个,现在我不知所措.我已经将问题缩小到与JSON相关,并且JSON似乎没有以清晰的格式发送.

我们之前使用的是Rails 3.0.7(我将要描述的问题不存在).我们需要升级Rails以利用一些新功能 - 但现在存在这个问题.我几乎可以肯定这是一个简单的配置或者什么,但是我需要更多关注它.

我们正在使用ActiveResource对象,在设置对象的值并保存它(从而产生PUT)时,我们得到ab 403:从远程Web服务返回Forbidden.这不是Web服务层的问题.

在创建一个新对象并进行POST时,我们得到一个409:在尝试使用默认值更新数据库时返回冲突 - 这意味着json数据未到达服务 - 或者不清晰.

我的问题是这在Rails 3.0.7中有效,并且不再适用于3.2.3(或我也尝试过的3.1.3).我对JSON数据以外的建议持开放态度,但我很确定这就是问题所在.

我的ActiveResource模型有

self.format = :json
Run Code Online (Sandbox Code Playgroud)

我在其中一个初始化文件中有以下内容:

ActiveResource::Base.include_root_in_json = false
ActiveSupport::JSON.backend = "json_gem" 
Run Code Online (Sandbox Code Playgroud)

谢谢你的任何建议!

UPDATE

我一直在测试curl并通过以下方式开始工作:

curl -H "Content-Type: application/json" -d "{\"userID\":\"xxx\", \"label\":\"doc.test.test\", \"value\":\"1,19\", \"id\":\"-1\"}" -v -X POST http://host:port/usermanagement/users/xxx/prefs
Run Code Online (Sandbox Code Playgroud)

我得到了它的工作,但是

  1. 似乎必须显式设置Content-Type标头,否则会导致415:Media Unrecognized错误

  2. 如果我在ActiveResource对象中设置Content-Type标头,我仍然会得到409:Conflict错误 - 这让我相信JSON仍未正确形成.

编辑(再次)

我已经弄清楚JSON的问题在哪里--Rails在JSON中保留了根.因此,而不是将资源作为

{"name":"value", "name":"value"}
Run Code Online (Sandbox Code Playgroud)

它正在发送

{"ResourceName": {"name":"value", "name":"value"}}
Run Code Online (Sandbox Code Playgroud)

但是,我设置include_root_in_json为false - 我在初始化文件中尝试了这一点,并且直接在模型本身中尝试了这一点,并且没有任何更改.

json activeresource actioncontroller ruby-on-rails-3.2

6
推荐指数
1
解决办法
2047
查看次数

使用ActiveRecord时格式化Rails日志

所以我有一个早期不需要ActiveRecord的应用程序 - 因此我们从应用程序中删除了ActiveRecord并将我们的日志记录格式化为:

在application.rb中:

class DreamLogFormatter < Logger::Formatter
  SEVERITY_TO_COLOR_MAP   = {'DEBUG'=>'32', 'INFO'=>'0;37', 'WARN'=>'35', 'ERROR'=>'31', 'FATAL'=>'31', 'UNKNOWN'=>'37'}

  def call(severity, time, progname, msg)
    color = SEVERITY_TO_COLOR_MAP[severity]
    "\033[0;37m[%s] \033[#{color}m%5s - %s\033[0m\n" % [time.to_s(:short), severity, msg2str(msg)]
  end
end

class ActiveSupport::BufferedLogger
  def formatter=(formatter)
    @log.formatter = formatter
  end
end
Run Code Online (Sandbox Code Playgroud)

在development.rb

config.logger = Logger.new("log/#{Rails.env}.log")
config.logger.formatter = DreamLogFormatter.new
ActiveResource::Base.logger =  Logger.new("log/#{Rails.env}.log")
ActiveResource::Base.logger.formatter = DreamLogFormatter.new
Run Code Online (Sandbox Code Playgroud)

注意:添加了ActiveResource记录器配置,因为我们希望我们的ActiveResource调用的URL输出如下:

GET http://localhost:2524/users/
 --> 200 OK 239 (13.0ms)
Run Code Online (Sandbox Code Playgroud)

使用此配置进行日志记录为我们提供了一个很好的输出组合,即ActiveResource调用和我们自己的日志记录Rails.logger.

但是,我们需要将ActiveRecord添加回我们的应用程序,因为我们需要将会话存储从cookie存储更改为ActiveRecord存储.自从重新添加ActiveRecord以来,日志记录不再有效.

以前的日志输出:

Started GET "/audit/?key1=value1&key2=value2" for 0:0:0:0:0:0:0:1%0 at 2012-08-15 15:39:58 -0400
[15 …
Run Code Online (Sandbox Code Playgroud)

logging activerecord ruby-on-rails activeresource ruby-on-rails-3.1

5
推荐指数
1
解决办法
1668
查看次数

Gemfile - 将生产宝石与开发宝石分开

所以我知道在Gemfile中我可以这样做:

group :development, :test do
  gem 'gem1'
  gem 'gem2'
end
Run Code Online (Sandbox Code Playgroud)

我想要完成的是这样的事情:

group :production do
  gem 'gem1'
  gem 'gem2'
end

group :development, :test do
  gem 'gem1', :path => '/Documents/Code/gem1/'
  gem 'gem2', :path => '/Documents/Code/gem2/'
end
Run Code Online (Sandbox Code Playgroud)

所以我们的应用程序使用了我们也在本地开发的2个宝石.为了在我们的本地机器上进行开发时缩短时间,我们希望能够将我们的开发环境指向宝石的本地副本 - 这样它就可以获取所有更改而无需重新启动rails服务器.否则我们将不得不重建gem,重新安装gem,并在gem中的每次开发更改时重新启动rails.

但是,这样做会给我带来以下错误:

You cannot specify the same gem twice coming from different sources. You specified that gem1 (>= 0) should come from an unspecfied source and source at /Documents/Code/gem1
Run Code Online (Sandbox Code Playgroud)

我试过甚至运行类似的东西bundle install --without production,我得到同样的错误.

有谁知道我是否有可能做我想做的事情?

谢谢!

ruby bundler ruby-on-rails-3 gemfile

4
推荐指数
2
解决办法
2716
查看次数