每当我有一个使用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
我一直在看这个,现在我不知所措.我已经将问题缩小到与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)
我得到了它的工作,但是
似乎必须显式设置Content-Type标头,否则会导致415:Media Unrecognized错误
如果我在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 - 我在初始化文件中尝试了这一点,并且直接在模型本身中尝试了这一点,并且没有任何更改.
所以我有一个早期不需要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
所以我知道在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,我得到同样的错误.
有谁知道我是否有可能做我想做的事情?
谢谢!