2016-04-18 9 views
5

मैं सिनात्रा और एक्टिव रिकार्ड के साथ खेल रहा था जब मुझे पता चला कि इस सरल एपीआई द्वारा कनेक्शन का पुन: उपयोग नहीं किया जाता है।मैं ActiveRecord में कनेक्शन का पुन: उपयोग कैसे करूं?

#!/usr/bin/env ruby                     

require 'sinatra' 
require 'active_record' 

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

ActiveRecord::Schema.define do 
    create_table :subscribers do |t| 
    t.string :email 
    t.timestamps 
    end 
end 

class Subscriber < ActiveRecord::Base 
    validates :email, presence: true 
end 

class Newsletter < Sinatra::Base 

    set :server, :thin 

    get '/subscribers/:email' do 
    s = Subscriber.find_by_email(params[:email]) 
    if s == nil 
     status 404 
    else 
     content_type 'application/json' 
     s.to_json 
    end 
    end 

    post '/subscribers/:email' do 
    Subscriber.create(email: params[:email]) 
    end 

end 

Newsletter.run! 

एपीआई रिटर्न या तो एक ग्राहक या एक 404 पहले 5 बार मैं एक ग्राहक प्राप्त करें। 6 वें बार मुझे टाइमआउट मिलता है। पहले 5 जीईटी में से प्रत्येक के बाद, newsletter.db के लिए एक और पढ़ें + लिखें फ़ाइल डिस्क्रिप्टर खुला है। मैं उम्मीद करता हूं कि हर समय केवल एक ही रहें।

मैं ActiveRecord को कनेक्शन का पुन: उपयोग करने के लिए कैसे कहूं?

+1

इस उत्तर को देखें http://stackoverflow.com/questions/10191531/activerecord-connection-warning-database-connections-will-not-be-closed-automa?rq=1 –

+0

उस उत्तर को देखकर , मुझे अंत में पता चला कि 'ActiveRecord :: Base.clear_active_connections' को कॉल करना मेरे लिए काम करता है। मैंने 'ActiveRecord :: Base.connection.close' को आजमाया और पाया कि जिस तरह से मैं कनेक्शन पूल से कनेक्शन वापस करने के बजाय कनेक्शन बंद करता हूं। मैंने 'config.ru' दृष्टिकोण का प्रयास नहीं किया। – mrrusof

उत्तर

1

Subscriber.find_by_email और Subscriber.create के प्रत्येक उपयोग के बाद कनेक्शन की सफाई का एक तरीका ActiveRecord::Base.clear_active_connections! पर कॉल करना है।

after do 
    ActiveRecord::Base.clear_active_connections! 
end 

Somewhere else, कुछ लोगों को मिडलवेयर ActiveRecord::ConnectionAdapters::ConnectionManagement उपयोग करने का सुझाव। यह पतले में काम नहीं करता है क्योंकि पतला एक थ्रेड में प्रत्येक अनुरोध को संसाधित करना शुरू कर देता है और दूसरे धागे में अनुरोध को संसाधित करता है। ConnectionManagement केवल उन कनेक्शनों को पूल पर लौटाता है जो वर्तमान धागे के लिए सक्रिय हैं और थिन पहले के बजाय दूसरे धागे में ConnectionManagement लागू होता है।

संपादित करें:

मैं क्यों मिडलवेयर ActiveRecord::Connectionadapters::ConnectionManagement का उपयोग कर थ्रेड मोड, जो आप here पा सकते हैं में पतला साथ काम नहीं करेंगे की एक विवरण दिया।

2016.05.18 संपादित करें:

मैं पतला लेखक के साथ इस मुद्दे को पीछा किया और इस मुद्दे को मुद्दा 307 के बाद हल नहीं होती है।

संबंधित मुद्दे