Method: Sequel::ThreadedConnectionPool#hold

Defined in:
lib/sequel/connection_pool/threaded.rb

#hold(server = nil) ⇒ Object

Chooses the first available connection, or if none are available, creates a new connection. Passes 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 immediately available and the pool is already using the maximum number of connections, Pool#hold will block until a connection is available or the timeout expires. If the timeout expires before a connection can be acquired, a Sequel::PoolTimeout is raised.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/sequel/connection_pool/threaded.rb', line 85

def hold(server=nil)
  t = Sequel.current
  if conn = owned_connection(t)
    return yield(conn)
  end
  begin
    conn = acquire(t)
    yield conn
  rescue Sequel::DatabaseDisconnectError, *@error_classes => e
    if disconnect_error?(e)
      oconn = conn
      conn = nil
      disconnect_connection(oconn) if oconn
      sync do 
        @allocated.delete(t)
        @waiter.signal
      end
    end
    raise
  ensure
    if conn
      sync{release(t)}
      if @connection_handling == :disconnect
        disconnect_connection(conn)
      end
    end
  end
end