From 0a29c2fafbfb7ed42c54208cea576c6b0d600d82 Mon Sep 17 00:00:00 2001 From: Russ Tyndall Date: Mon, 5 Jan 2009 14:18:42 -0500 Subject: [PATCH] Modified pool.lisp:acquire-from-conn-pool to perform connection 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 | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/sql/pool.lisp b/sql/pool.lisp index 4573155..7aa3c99 100644 --- a/sql/pool.lisp +++ b/sql/pool.lisp @@ -36,25 +36,25 @@ (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 -- 2.34.1