Timeouts for idle database sessions. Author: Vlad Khorsun Description: The feature allows to automatically close user connection after period of inactivity. It could be used by database administrators to forcibly close old inactive connections and free resources it occupies. Application and tools developers also could find it as easy replacement of self-made control for the connection life time. It is recommended (but not required) to set idle timeout to reasonable big value, such as few hours. By default it is not enabled. The feature works as below - when user API call leaves engine, special idle timer assotiated with current connection is started - when user API call enters engine, idle timer is stopped - when idle time is fired engine immediately closes the connection in the same way as with asyncronous connection cancellation: - all active statements and cursors are closed - all active transactions are rolled back - network connection is not closed at this moment. It allows client application to get exact error code on next API call. Network connection will be closed by the server side after error is reported or due to network timeout if client side disconnects. - idle session timeout could be set: - at database level, by setting value in firebird.conf (or databases.conf) by database administrator scope - all user connections, except of system connections (garbage collector, cache writer, etc) units - minutes - at connection level, using API and\or new SQL statement (see below) scope - given connection units - up to seconds - effective value of idle timeout is evaluated every time user API call leaves the engine as: - if not set at connection level, look at database level - in any case can't be greater than value set at database level i.e. value of idle timeout could be overriden by application developer at given connection but it can't relax limit set by DBA (in config) - zero timeout means no timeout, i.e. idle timer will not start - while idle timeout is set in seconds at API level, we can't promise absolute precision. With high load it could be less precise. The only guarantee is that timeout will not fire before specified moment. - if connection was cancelled, next user API call returns error isc_att_shutdown with secondary error code specifying exact reason: isc_att_shut_killed: Killed by database administrator isc_att_shut_idle: Idle timeout expired isc_att_shut_db_down: Database is shutdown isc_att_shut_engine: Engine is shutdown Support at configuration level (firebird.conf and\or databases.conf) New setting "ConnectionIdleTimeout": set number of minutes after which idle connection will be disconnected by the engine. Zero means no timeout is set. Per-database configurable. Type: integer. Default value is 0. Support at API level - get\set idle connection timeout, seconds interface Attachment uint getIdleTimeout(Status status); void setIdleTimeout(Status status, uint timeOut); - get idle connection timeout at config and\or connection level is possible using isc_database_info() API with new info tags: - fb_info_ses_idle_timeout_db value set at config level - fb_info_ses_idle_timeout_att value set at given connection level - fb_info_ses_idle_timeout_run actual timeout value for given connection evaluated considering values set at config and connection levels, see "effective value of idle timeout" above Remote client implementation notes: - Attachment::setIdleTimeout() issued "SET SESSION IDLE TIMEOUT" SQL statement - Attachment::getIdleTimeout() calls isc_database_info() with fb_info_ses_idle_timeout_att tag If remote server doesn't support idle connection timeouts (protocol version less than 16): - Attachment::setIdleTimeout() will return isc_wish_list error - Attachment::getIdleTimeout() will return zero and set isc_wish_list error - isc_database_info() will return isc_info_error tag in info buffer (as usual). Support in SQL - New SQL statement allows to set idle connection timeout at connection level: SET SESSION IDLE TIMEOUT [HOUR | MINUTE | SECOND] if timepart is not set, default is MINUTE. This statement could run outside of transaction control and immediately effective. - Context variables Context 'SYSTEM' have new variable: 'SESSION_IDLE_TIMEOUT'. It contains current value of idle connection timeout that was set at connection level, or zero, if timeout was not set. - Monitoring tables MON$ATTACHMENTS MON$IDLE_TIMEOUT Connection level idle timeout MON$IDLE_TIMER Idle timer expiration time MON$IDLE_TIMEOUT contains timeout value set at connection level, in seconds. Zero, if timeout is not set. MON$IDLE_TIMER contains NULL value if idle timeout was not set or if timer is not running.