Class: OCI8EnhancedAutoRecover
- Defined in:
- lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb
Overview
The OCI8AutoRecover class enhances the OCI8 driver with auto-recover and reset functionality. If a call to #exec fails, and autocommit is turned on (ie., we’re not in the middle of a longer transaction), it will automatically reconnect and try again. If autocommit is turned off, this would be dangerous (as the earlier part of the implied transaction may have failed silently if the connection died) – so instead the connection is marked as dead, to be reconnected on it’s next use.
Constant Summary collapse
- LOST_CONNECTION_ERROR_CODES =
ORA-00028: your session has been killed ORA-01012: not logged on ORA-03113: end-of-file on communication channel ORA-03114: not connected to ORACLE ORA-03135: connection lost contact
[ 28, 1012, 3113, 3114, 3135 ]
- @@auto_retry =
false
Instance Attribute Summary collapse
-
#active ⇒ Object
(also: #active?)
Returns the value of attribute active.
Instance Method Summary collapse
- #describe(name) ⇒ Object
-
#exec(sql, *bindvars, &block) ⇒ Object
Adds auto-recovery functionality.
-
#initialize(config, factory) ⇒ OCI8EnhancedAutoRecover
constructor
A new instance of OCI8EnhancedAutoRecover.
-
#ping ⇒ Object
Checks connection, returns true if active.
-
#reset! ⇒ Object
Resets connection, by logging off and creating a new connection.
Constructor Details
#initialize(config, factory) ⇒ OCI8EnhancedAutoRecover
Returns a new instance of OCI8EnhancedAutoRecover.
282 283 284 285 286 287 288 |
# File 'lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb', line 282 def initialize(config, factory) @active = true @config = config @factory = factory @connection = @factory.new_connection @config super @connection end |
Instance Attribute Details
#active ⇒ Object Also known as: active?
Returns the value of attribute active.
273 274 275 |
# File 'lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb', line 273 def active @active end |
Instance Method Details
#describe(name) ⇒ Object
341 342 343 |
# File 'lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb', line 341 def describe(name) @connection.describe(name) end |
#exec(sql, *bindvars, &block) ⇒ Object
Adds auto-recovery functionality.
324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
# File 'lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb', line 324 def exec(sql, *bindvars, &block) should_retry = self.class.auto_retry? && autocommit? begin @connection.exec(sql, *bindvars, &block) rescue OCIException => e raise unless LOST_CONNECTION_ERROR_CODES.include?(e.code) @active = false raise unless should_retry should_retry = false reset! rescue nil retry end end |
#ping ⇒ Object
Checks connection, returns true if active. Note that ping actively checks the connection, while #active? simply returns the last known state.
293 294 295 296 297 298 299 |
# File 'lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb', line 293 def ping @connection.exec("select 1 from dual") { |r| nil } @active = true rescue @active = false raise end |
#reset! ⇒ Object
Resets connection, by logging off and creating a new connection.
302 303 304 305 306 307 308 309 310 311 312 |
# File 'lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb', line 302 def reset! logoff rescue nil begin @connection = @factory.new_connection @config __setobj__ @connection @active = true rescue @active = false raise end end |