2012-04-17 34 views
9

Tôi đang cố tạo một ứng dụng nhỏ với Sinatra và ActiveRecord (3.2.3).Cảnh báo kết nối ActiveRecord. (Kết nối cơ sở dữ liệu sẽ không tự động bị đóng)

Đây là cách tập tin chính của tôi trông giống như:

require "sinatra" 
require "sinatra/reloader" 
require "active_record" 
... 

ActiveRecord::Base.establish_connection(
    adapter: 'sqlite3', 
    database: 'db.sqlite3', 
    host:  'localhost', 
) 

class Post < ActiveRecord::Base 
    ... 
end 

get('/') { ... } 
get('/posts') { ... } 
... 

Nó hoạt động, nhưng đôi khi tôi nhận được một cảnh báo trong giao diện điều khiển:

deprecation Chú ý: kết nối cơ sở dữ liệu sẽ không bị đóng cửa tự động, vui lòng đóng kết nối cơ sở dữ liệu của bạn ở cuối luồng bằng cách gọi số close trên kết nối của bạn. Ví dụ: ActiveRecord :: Base.connection.close '

Khi xảy ra cảnh báo, phải mất một thời gian dài trước khi làm mới trang. Tôi không hiểu nơi tôi nên đóng kết nối. Tôi đã cố gắng để đặt ActiveRecord::Base.connection.close ở dưới cùng của tập tin, nhưng nó không giúp đỡ.

update:

tôi quên đề cập đến mà tôi cũng sử dụng plugin Sinatra/reloader từ sinatra-contrib đá quý để nhìn vào hiệu lực thi hành mà không cần khởi động lại máy chủ.

require "sinatra/reloader" 

Nếu tôi nhận xét thì vấn đề sẽ biến mất. Nhưng dù sao, tôi tự hỏi làm thế nào để thoát khỏi vấn đề mà không vô hiệu hóa nạp lại.

Trả lời

13

Bạn cần thêm phần mềm trung gian vào ngăn xếp của mình. Chỉ cần thêm dòng này vào config.ru bạn rack lên file:

use ActiveRecord::ConnectionAdapters::ConnectionManagement 

Tìm thấy câu trả lời ở đây: https://github.com/puma/puma/issues/59

+0

Tuyệt vời. Cảm ơn –

13

Câu trả lời được chấp nhận không làm việc cho tôi trong Sinatra trên Thin (chế độ luồng). Thay vào đó tôi đã sử dụng:

after do 
    ActiveRecord::Base.connection.close 
end 
+0

Tôi thấy điều tương tự cũng đúng với tôi. Bất cứ ai biết tại sao đây là trường hợp? Đối với những người đã làm việc này, bạn đang sử dụng cái gì cho một máy chủ? – PICyourBrain

+0

Tôi đã thử điều này nhưng vẫn không hoạt động đối với tôi. – jamesfzhang

+0

Câu trả lời này hoạt động trên ứng dụng sinatra với db_pool là 10 chạy trên puma. –

1
ActiveRecord::Base.remove_connection 

trình tốt cho tôi và được liệt kê trong tài liệu.

+0

Vị trí trong tài liệu? Họ nên sử dụng mã này ở đâu? – Adam

+1

Chào mừng bạn đến với StackOverflow! Điều này không đủ điều kiện như một câu trả lời và có lẽ nên là một bình luận. –

+0

@Adam http://www.rubydoc.info/gems/activerecord/5.1.0/ActiveRecord/ConnectionHandling#remove_connection-instance_method - phương pháp sẽ được gọi khi cơ sở dữ liệu không còn cần thiết nữa. – ryu

Các vấn đề liên quan