The number of seconds that need to pass since connection checkin before attempting to validate the connection when checking it out from the pool. Defaults to 3600 seconds (1 hour).
Initialize the data structures used by this extension.
# File lib/sequel/extensions/connection_validator.rb, line 57 def self.extended(pool) pool.instance_eval do @connection_timestamps ||= {} @connection_validation_timeout = 3600 end # Make sure the valid connection SQL query is precached, # otherwise it's possible it will happen at runtime. While # it should work correctly at runtime, it's better to avoid # the possibility of failure altogether. pool.db.send(:valid_connection_sql) end
When acquiring a connection, if it has been idle for longer than the connection validation timeout, test the connection for validity. If it is not valid, disconnect the connection, and retry with a new connection.
# File lib/sequel/extensions/connection_validator.rb, line 83 def acquire(*a) begin if (conn = super) && (t = sync{@connection_timestamps.delete(conn)}) && Time.now - t > @connection_validation_timeout && !db.valid_connection?(conn) if pool_type == :sharded_threaded sync{allocated(a.last).delete(Thread.current)} else sync{@allocated.delete(Thread.current)} end db.disconnect_connection(conn) raise Retry end rescue Retry retry end conn end
Record the time the connection was checked back into the pool.
# File lib/sequel/extensions/connection_validator.rb, line 73 def checkin_connection(*) conn = super @connection_timestamps[conn] = Time.now conn end