module Sequel::ConnectionValidator
Attributes
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).
Public Class Methods
Source
# File lib/sequel/extensions/connection_validator.rb 63 def self.extended(pool) 64 case pool.pool_type 65 when :single, :sharded_single 66 raise Error, "cannot load connection_validator extension if using single or sharded_single connection pool" 67 end 68 69 pool.instance_exec do 70 sync do 71 @connection_timestamps ||= {} 72 @connection_validation_timeout ||= 3600 73 end 74 end 75 76 # Make sure the valid connection SQL query is precached, 77 # otherwise it's possible it will happen at runtime. While 78 # it should work correctly at runtime, it's better to avoid 79 # the possibility of failure altogether. 80 pool.db.send(:valid_connection_sql) 81 end
Initialize the data structures used by this extension.
Private Instance Methods
Source
# File lib/sequel/extensions/connection_validator.rb 102 def acquire(*a) 103 conn = nil 104 105 1.times do 106 if (conn = super) && 107 (timer = sync{@connection_timestamps.delete(conn)}) && 108 Sequel.elapsed_seconds_since(timer) > @connection_validation_timeout 109 110 begin 111 valid = db.valid_connection?(conn) 112 ensure 113 unless valid 114 case pool_type 115 when :sharded_threaded, :sharded_timed_queue 116 sync{@allocated[a.last].delete(Sequel.current)} 117 else 118 sync{@allocated.delete(Sequel.current)} 119 end 120 121 disconnect_connection(conn) 122 redo if valid == false 123 end 124 end 125 end 126 end 127 128 conn 129 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.
Calls superclass method
Source
# File lib/sequel/extensions/connection_validator.rb 86 def checkin_connection(*) 87 conn = super 88 @connection_timestamps[conn] = Sequel.start_timer 89 conn 90 end
Record the time the connection was checked back into the pool.
Calls superclass method
Source
# File lib/sequel/extensions/connection_validator.rb 93 def disconnect_connection(conn) 94 sync{@connection_timestamps.delete(conn)} 95 super 96 end
Clean up timestamps during disconnect.
Calls superclass method