X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=sql%2Fpool.lisp;h=f3645086e6920decb5c87a9ba7a624f5c6ca47b0;hb=f3430ff34ef6631daf20cb9c69ecbc7ad84d14df;hp=7aa3c994b4a0f7a1ea7e45766dcc93457a0009e5;hpb=0a29c2fafbfb7ed42c54208cea576c6b0d600d82;p=clsql.git diff --git a/sql/pool.lisp b/sql/pool.lisp index 7aa3c99..f364508 100644 --- a/sql/pool.lisp +++ b/sql/pool.lisp @@ -32,15 +32,26 @@ :initform (make-process-lock "Connection pool")))) (defun acquire-from-conn-pool (pool) + "Try to find a working database connection in the pool or create a new +one if needed. This performs 1 query against the DB to ensure it's still +valid. When possible (postgres, mssql) that query will be a reset +command to put the connection back into its default state." (or (with-process-lock ((conn-pool-lock pool) "Acquire from pool") (when (plusp (length (free-connections pool))) (let ((pconn (vector-pop (free-connections pool)))) ;; test if connection still valid. ;; (e.g. db reboot -> invalid connection ) (handler-case - (case (database-type pconn) - (:mysql + (case (database-underlying-type pconn) + (:postgresql + ;; This resets the connection to "New" state + (database-execute-command "DISCARD ALL;" pconn)) + (:mysql (database-query "SHOW ERRORS LIMIT 1" pconn nil nil)) + (:mssql + ;; rpc escape sequence since this can't be called as a normal sp. + ;;http://msdn.microsoft.com/en-us/library/aa198358%28SQL.80%29.aspx + (database-execute-command "{rpc sp_reset_connection}" pconn)) (T (database-query "SELECT 1;" pconn '(integer) nil))) (sql-database-error (e) @@ -64,7 +75,7 @@ Disconnecting.~%" (setf (conn-pool conn) pool)) conn))) -(defun release-to-conn-pool (conn) +(defmethod release-to-conn-pool (conn) (let ((pool (conn-pool conn))) (with-process-lock ((conn-pool-lock pool) "Release to pool") (vector-push-extend conn (free-connections pool)))))