Class | ConnectionPool |
In: |
lib/assistance/connection_pool.rb
|
Parent: | Object |
A ConnectionPool manages access to database connections by keeping multiple connections and giving threads exclusive access to each connection.
allocated | [R] | |
available_connections | [R] | |
connection_proc | [RW] | The proc used to create a new connection. |
created_count | [R] | |
max_size | [R] | The maximum number of connections. |
mutex | [R] |
Constructs a new pool with a maximum size. If a block is supplied, it is used to create new connections as they are needed.
pool = ConnectionPool.new(10) {MyConnection.new(opts)}
The connection creation proc can be changed at any time by assigning a Proc to pool#connection_proc.
pool = ConnectionPool.new(10) pool.connection_proc = proc {MyConnection.new(opts)}
# File lib/assistance/connection_pool.rb, line 27 27: def initialize(max_size = 4, &block) 28: @max_size = max_size 29: @mutex = Mutex.new 30: @connection_proc = block 31: 32: @available_connections = [] 33: @allocated = {} 34: @created_count = 0 35: end
Removes all connection currently available, optionally yielding each connection to the given block. This method has the effect of disconnecting from the database. Once a connection is requested using hold, the connection pool creates new connections to the database.
# File lib/assistance/connection_pool.rb, line 74 74: def disconnect(&block) 75: @mutex.synchronize do 76: @available_connections.each {|c| block[c]} if block 77: @available_connections = [] 78: @created_count = @allocated.size 79: end 80: end
Assigns a connection to the current thread, yielding the connection to the supplied block.
pool.hold {|conn| conn.execute('DROP TABLE posts')}
Pool#hold is re-entrant, meaning it can be called recursively in the same thread without blocking.
If no connection is available, Pool#hold will block until a connection is available.
# File lib/assistance/connection_pool.rb, line 52 52: def hold 53: t = Thread.current 54: if (conn = owned_connection(t)) 55: return yield(conn) 56: end 57: while !(conn = acquire(t)) 58: sleep 0.001 59: end 60: begin 61: yield conn 62: ensure 63: release(t) 64: end 65: rescue Exception => e 66: # if the error is not a StandardError it is converted into RuntimeError. 67: raise e.is_a?(StandardError) ? e : e.message 68: end