我熟悉 Ruby on Rails、DB(MS) 驱动程序和存储过程之间长期存在的爱恨交织关系,我从 2.3.2 版开始就一直在开发 Rails 应用程序。
但是,每隔一段时间就会出现这样一种情况,即 SP 只是比在(慢得多的)应用程序级别上组合数据更好的选择。具体来说,运行结合了来自多个表的数据的报告通常更适合 SP。
为什么存储过程仍然如此糟糕地集成到 Rails 或 MySQL gem 中。我目前正在使用 Rails 3.0.10 和 MySQL2 gem 0.2.13 开发一个项目,但据我所知,即使是最新的 Edge Rails 和 MySQL gem 0.3+ 在使用 SP 时仍然会发脾气。
一直存在并且仍然存在的问题是调用 SP 后数据库连接丢失。
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
=> #<Mysql::Result:0x103429c90>
>> ActiveRecord::Base.connection.execute("CALL stored_proc")
ActiveRecord::StatementInvalid: Mysql::Error: Commands out of sync;
[...]
>> ActiveRecord::Base.connection.active?
=> false
>> ActiveRecord::Base.connection.reconnect!
=> nil
>> ActiveRecord::Base.connection.execute("CALL proc01")
=> #<Mysql::Result:0x1034102e0>
>> ActiveRecord::Base.connection.active?
=> false
从技术上讲,这是一个很难解决的问题,还是 Rails 的设计选择?