class Sequel::ShardedSingleConnectionPool

A ShardedSingleConnectionPool is a single threaded connection pool that works with multiple shards/servers.

Public Class Methods

new(db, opts=OPTS) click to toggle source

The single threaded pool takes the following options:

:servers

A hash of servers to use. Keys should be symbols. If not present, will use a single :default server.

:servers_hash

The base hash to use for the servers. By default, Sequel uses Hash.new(:default). You can use a hash with a default proc that raises an error if you want to catch all cases where a nonexistent server is used.

Calls superclass method Sequel::ConnectionPool.new
# File lib/sequel/connection_pool/sharded_single.rb, line 12
def initialize(db, opts=OPTS)
  super
  @conns = {}
  @servers = opts.fetch(:servers_hash, Hash.new(:default))
  add_servers([:default])
  add_servers(opts[:servers].keys) if opts[:servers]
end

Public Instance Methods

add_servers(servers) click to toggle source

Adds new servers to the connection pool. Primarily used in conjunction with master/slave or shard configurations. Allows for dynamic expansion of the potential slaves/shards at runtime. servers argument should be an array of symbols.

# File lib/sequel/connection_pool/sharded_single.rb, line 23
def add_servers(servers)
  servers.each{|s| @servers[s] = s}
end
all_connections() { |c| ... } click to toggle source

Yield all of the currently established connections

# File lib/sequel/connection_pool/sharded_single.rb, line 28
def all_connections
  @conns.values.each{|c| yield c}
end
conn(server=:default) click to toggle source

The connection for the given server.

# File lib/sequel/connection_pool/sharded_single.rb, line 33
def conn(server=:default)
  @conns[@servers[server]]
end
disconnect(opts=OPTS) click to toggle source

Disconnects from the database. Once a connection is requested using hold, the connection is reestablished. Options:

:server

Should be a symbol specifing the server to disconnect from, or an array of symbols to specify multiple servers.

# File lib/sequel/connection_pool/sharded_single.rb, line 41
def disconnect(opts=OPTS)
  (opts[:server] ? Array(opts[:server]) : servers).each{|s| disconnect_server(s)}
end
hold(server=:default) { |conns ||= make_new(server)| ... } click to toggle source

Yields the connection to the supplied block for the given server. This method simulates the ConnectionPool#hold API.

# File lib/sequel/connection_pool/sharded_single.rb, line 47
def hold(server=:default)
  begin
    server = pick_server(server)
    yield(@conns[server] ||= make_new(server))
  rescue Sequel::DatabaseDisconnectError
    disconnect_server(server)
    raise
  end
end
max_size() click to toggle source

The ShardedSingleConnectionPool always has a maximum size of 1.

# File lib/sequel/connection_pool/sharded_single.rb, line 58
def max_size
  1
end
pool_type() click to toggle source
# File lib/sequel/connection_pool/sharded_single.rb, line 84
def pool_type
  :sharded_single
end
remove_servers(servers) click to toggle source

Remove servers from the connection pool. Primarily used in conjunction with master/slave or shard configurations. Similar to disconnecting from all given servers, except that after it is used, future requests for the server will use the :default server instead.

# File lib/sequel/connection_pool/sharded_single.rb, line 66
def remove_servers(servers)
  raise(Sequel::Error, "cannot remove default server") if servers.include?(:default)
  servers.each do |server|
    disconnect_server(server)
    @servers.delete(server)
  end
end
servers() click to toggle source

Return an array of symbols for servers in the connection pool.

# File lib/sequel/connection_pool/sharded_single.rb, line 75
def servers
  @servers.keys
end
size() click to toggle source

The number of different shards/servers this pool is connected to.

# File lib/sequel/connection_pool/sharded_single.rb, line 80
def size
  @conns.length
end

Private Instance Methods

disconnect_server(server) click to toggle source

Disconnect from the given server, if connected.

# File lib/sequel/connection_pool/sharded_single.rb, line 91
def disconnect_server(server)
  if conn = @conns.delete(server)
    db.disconnect_connection(conn)
  end
end
pick_server(server) click to toggle source

If the server given is in the hash, return it, otherwise, return the default server.

# File lib/sequel/connection_pool/sharded_single.rb, line 98
def pick_server(server)
  @servers[server]
end
preconnect() click to toggle source

Make sure there is a valid connection for each server.

# File lib/sequel/connection_pool/sharded_single.rb, line 103
def preconnect
  servers.each{|s| hold(s){}}
end