ruby-on-rails – 没有数据库的Rails控制器
乍一看,我确信这个标题听起来像是一个曾被问过一百万次的问题……但事实并非如此.
我的应用程序使用数据库,但只有部分应用程序实际上依赖于数据库正在运行.我想确保在数据库关闭时,不依赖于数据库的应用程序部分仍然可以正常运行. 问题是……一旦Rails应用程序意识到它丢失了数据库连接,应用程序的任何部分(除了静态内容)都可以工作. (即,在执行流程到达不依赖于数据库的控制器之前抛出异常 – 如果允许这样做的话,控制器会很好.) 有没有办法实现我正在寻找的东西?任何帮助表示赞赏! 更新: 仔细检查后,我相信这个问题归结为: 有没有办法使用“懒惰”数据库连接池/处理,以便在绝对需要之前不会从池中检出数据库连接?如果可能,即使/当数据库关闭时,这将允许完全不使用数据库的请求继续. 思考? 更新2: 添加堆栈跟踪.这表明当数据库连接不可用时,控制权永远不会进入控制器. (数据库显然是故意关闭的,所以我可以测试一下.) PG::Error could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? activerecord (4.0.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:771:in `initialize' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:771:in `new' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:771:in `connect' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:493:in `initialize' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `new' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `postgresql_connection' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:446:in `new_connection' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:456:in `checkout_new_connection' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:427:in `acquire_connection' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:364:in `block in checkout' /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `checkout' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:273:in `block in connection' /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:272:in `connection' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:552:in `retrieve_connection' activerecord (4.0.0.beta1) lib/active_record/connection_handling.rb:79:in `retrieve_connection' activerecord (4.0.0.beta1) lib/active_record/connection_handling.rb:53:in `connection' activerecord (4.0.0.beta1) lib/active_record/query_cache.rb:51:in `restore_query_cache_settings' activerecord (4.0.0.beta1) lib/active_record/query_cache.rb:43:in `rescue in call' activerecord (4.0.0.beta1) lib/active_record/query_cache.rb:32:in `call' activerecord (4.0.0.beta1) lib/active_record/connection_adapters/abstract/connection_pool.rb:632:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' activesupport (4.0.0.beta1) lib/active_support/callbacks.rb:373:in `_run__2745032424595922925__call__callbacks' activesupport (4.0.0.beta1) lib/active_support/callbacks.rb:78:in `run_callbacks' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/callbacks.rb:27:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/reloader.rb:64:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' railties (4.0.0.beta1) lib/rails/rack/logger.rb:38:in `call_app' railties (4.0.0.beta1) lib/rails/rack/logger.rb:21:in `block in call' activesupport (4.0.0.beta1) lib/active_support/tagged_logging.rb:67:in `block in tagged' activesupport (4.0.0.beta1) lib/active_support/tagged_logging.rb:25:in `tagged' activesupport (4.0.0.beta1) lib/active_support/tagged_logging.rb:67:in `tagged' railties (4.0.0.beta1) lib/rails/rack/logger.rb:21:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/request_id.rb:21:in `call' rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' rack (1.5.2) lib/rack/runtime.rb:17:in `call' activesupport (4.0.0.beta1) lib/active_support/cache/strategy/local_cache.rb:72:in `call' rack (1.5.2) lib/rack/lock.rb:17:in `call' actionpack (4.0.0.beta1) lib/action_dispatch/middleware/static.rb:64:in `call' railties (4.0.0.beta1) lib/rails/engine.rb:510:in `call' railties (4.0.0.beta1) lib/rails/application.rb:96:in `call' rack (1.5.2) lib/rack/lock.rb:17:in `call' rack (1.5.2) lib/rack/content_length.rb:14:in `call' rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service' /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service' /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run' /usr/local/rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread' 解决方法
对不起,我正在回答有关Rails 3的问题,但我希望它会有所帮助.
我在一些不同的情况下遇到了同样的问题,所以我在stacktraces和rails代码中挖掘并找到了如何在两行中修复它. TL; DR: # config/application.rb # before your application declaration ActiveRecord::Railtie.initializers.reject! { |i| i.name == 'active_record.set_reloader_hooks' } # inside your application declaration config.middleware.delete ActiveRecord::QueryCache 首先,当rails启动时,它会调用ActionDispatch :: Reloader.prepare! (一次用于生产,每次开发请求).此方法类似于单元测试中的设置,它会重置许多内容,其中包括清除连接池中的连接并清除架构缓存,后者从池中检出数据库连接.所以第一行删除了active_record / railtie中添加该回调的初始化程序.可能你只想在生产环境中这样做,但是这个修改应该在application.rb或更高版本才能工作. 其次,rails确实会在每个请求上检出数据库连接,但这是在ActiveRecord :: QueryCache中间件中完成的.我决定没有它我能做到.如果你确实需要它,我认为你可以在around_filter中启用和重置缓存. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |