module Sequel::ConnectionExpiration

Attributes

connection_expiration_random_delay[RW]

The maximum number of seconds that will be added as a random delay to the expiration timeout Defaults to 0 seconds (no random delay).

connection_expiration_timeout[RW]

The number of seconds that need to pass since connection creation before expiring a connection. Defaults to 14400 seconds (4 hours).

Public Class Methods

extended(pool) click to toggle source

Initialize the data structures used by this extension.

   # File lib/sequel/extensions/connection_expiration.rb
46 def self.extended(pool)
47   pool.instance_exec do
48     sync do
49       @connection_expiration_timestamps ||= {}
50       @connection_expiration_timeout ||= 14400
51       @connection_expiration_random_delay ||= 0
52     end
53   end
54 end

Private Instance Methods

acquire(*a) click to toggle source

When acquiring a connection, check if the connection is expired. If it is expired, disconnect the connection, and retry with a new connection.

Calls superclass method
   # File lib/sequel/extensions/connection_expiration.rb
74 def acquire(*a)
75   begin
76     if (conn = super) &&
77        (cet = sync{@connection_expiration_timestamps[conn]}) &&
78        Sequel.elapsed_seconds_since(cet[0]) > cet[1]
79 
80       if pool_type == :sharded_threaded
81         sync{allocated(a.last).delete(Thread.current)}
82       else
83         sync{@allocated.delete(Thread.current)}
84       end
85 
86       disconnect_connection(conn)
87       raise Retry
88     end
89   rescue Retry
90     retry
91   end
92 
93   conn
94 end
disconnect_connection(conn) click to toggle source

Clean up expiration timestamps during disconnect.

Calls superclass method
   # File lib/sequel/extensions/connection_expiration.rb
59 def disconnect_connection(conn)
60   sync{@connection_expiration_timestamps.delete(conn)}
61   super
62 end
make_new(*) click to toggle source

Record the time the connection was created.

Calls superclass method
   # File lib/sequel/extensions/connection_expiration.rb
65 def make_new(*)
66   conn = super
67   @connection_expiration_timestamps[conn] = [Sequel.start_timer, @connection_expiration_timeout + (rand * @connection_expiration_random_delay)].freeze
68   conn
69 end