: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)
(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)))))