class Sequel::ShardedSingleConnectionPool
A ShardedSingleConnectionPool
is a single threaded connection pool that works with multiple shards/servers.
Public Class Methods
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.
Sequel::ConnectionPool::new
# File lib/sequel/connection_pool/sharded_single.rb 14 def initialize(db, opts=OPTS) 15 super 16 @conns = {} 17 @servers = opts.fetch(:servers_hash, Hash.new(:default)) 18 add_servers([:default]) 19 add_servers(opts[:servers].keys) if opts[:servers] 20 end
Public Instance Methods
Adds new servers to the connection pool. Primarily used in conjunction with primary/replica or sharded configurations. Allows for dynamic expansion of the potential replicas/shards at runtime. servers
argument should be an array of symbols.
# File lib/sequel/connection_pool/sharded_single.rb 25 def add_servers(servers) 26 servers.each{|s| @servers[s] = s} 27 end
Yield all of the currently established connections
# File lib/sequel/connection_pool/sharded_single.rb 30 def all_connections 31 @conns.values.each{|c| yield c} 32 end
The connection for the given server.
# File lib/sequel/connection_pool/sharded_single.rb 35 def conn(server=:default) 36 @conns[@servers[server]] 37 end
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 43 def disconnect(opts=OPTS) 44 (opts[:server] ? Array(opts[:server]) : servers).each{|s| disconnect_server(s)} 45 end
# File lib/sequel/connection_pool/sharded_single.rb 47 def freeze 48 @servers.freeze 49 super 50 end
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 54 def hold(server=:default) 55 begin 56 server = pick_server(server) 57 yield(@conns[server] ||= make_new(server)) 58 rescue Sequel::DatabaseDisconnectError, *@error_classes => e 59 disconnect_server(server) if disconnect_error?(e) 60 raise 61 end 62 end
The ShardedSingleConnectionPool
always has a maximum size of 1.
# File lib/sequel/connection_pool/sharded_single.rb 65 def max_size 66 1 67 end
# File lib/sequel/connection_pool/sharded_single.rb 90 def pool_type 91 :sharded_single 92 end
Remove servers from the connection pool. 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 72 def remove_servers(servers) 73 raise(Sequel::Error, "cannot remove default server") if servers.include?(:default) 74 servers.each do |server| 75 disconnect_server(server) 76 @servers.delete(server) 77 end 78 end
Return an array of symbols for servers in the connection pool.
# File lib/sequel/connection_pool/sharded_single.rb 81 def servers 82 @servers.keys 83 end
The number of different shards/servers this pool is connected to.
# File lib/sequel/connection_pool/sharded_single.rb 86 def size 87 @conns.length 88 end
Private Instance Methods
Disconnect from the given server, if connected.
# File lib/sequel/connection_pool/sharded_single.rb 97 def disconnect_server(server) 98 if conn = @conns.delete(server) 99 disconnect_connection(conn) 100 end 101 end
If the server given is in the hash, return it, otherwise, return the default server.
# File lib/sequel/connection_pool/sharded_single.rb 104 def pick_server(server) 105 @servers[server] 106 end
Make sure there is a valid connection for each server.
# File lib/sequel/connection_pool/sharded_single.rb 109 def preconnect(concurrent = nil) 110 servers.each{|s| hold(s){}} 111 end