Modified pool.lisp:acquire-from-conn-pool to perform connection
authorRuss Tyndall <russ@acceleration.net>
Mon, 5 Jan 2009 19:18:42 +0000 (14:18 -0500)
committerNathan Bird <nathan@acceleration.net>
Mon, 2 Feb 2009 19:31:28 +0000 (14:31 -0500)
validity checks on all returned connections.

Pooled connections can become invalid whenever the pipe goes down,
(such as db reboot). To do this check we 'SELECT 1;' on the connection
and catch any errors that occur, disconnecting the connection if it
is no longer valid

sql/pool.lisp

index 457315560bc5499c494c4da3a5e5e87f25050d7b..7aa3c994b4a0f7a1ea7e45766dcc93457a0009e5 100644 (file)
         (when (plusp (length (free-connections pool)))
           (let ((pconn (vector-pop (free-connections pool))))
             ;; test if connection still valid.
-            ;; Currently, on supported on MySQL
-            (cond
-              ((eq :mysql (database-type pconn))
-               (handler-case
-                   (database-query "SHOW ERRORS LIMIT 1" pconn nil nil)
-                 (error (e)
-                   ;; we could check for error type 2006 for "SERVER GONE AWAY",
-                   ;; but, it's safer just to disconnect the pooled conn for any error
-                   (warn "Database connection ~S had an error when attempted to be acquired from the pool:
+           ;; (e.g. db reboot -> invalid connection )
+           (handler-case
+               (case (database-type pconn)
+                 (:mysql 
+                    (database-query "SHOW ERRORS LIMIT 1" pconn nil nil))
+                 (T
+                    (database-query "SELECT 1;"  pconn '(integer) nil)))
+             (sql-database-error (e)
+               ;; we could check for a specific error,
+               ;; but, it's safer just to disconnect the pooled conn for any error ?
+               (warn "Database connection ~S had an error when attempted to be acquired from the pool:
   ~S
 Disconnecting.~%"
-                         pconn e)
-                   (ignore-errors (database-disconnect pconn))
-                   nil)
-                 (:no-error (res fields)
-                   (declare (ignore res fields))
-                   pconn)))
-              (t
-               pconn)))))
+                     pconn e)
+               (ignore-errors (database-disconnect pconn))
+               nil)
+             (:no-error (&rest args)
+               (declare (ignore args))
+               pconn)))))
       (let ((conn (connect (connection-spec pool)
                            :database-type (pool-database-type pool)
                            :if-exists :new