Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; connection pool
- (defvar *connection-pool* nil)
- ;; アプリケーションサーバが立ち上がるときに実行
- (defun init-database (driver-name &rest params &key database-name &allow-other-keys)
- "initialize database"
- (setf *connection-pool* (apply #'dbi-cp:make-dbi-connection-pool driver-name params)))
- ;; アプリケーションサーバ終了時に実行
- (defun shutdown-database ()
- (dbi-cp:shutdown *connection-pool*))
- ;; こんな感じのマクロを定義
- (defmacro transactional ((db) &body body)
- "transactional macro like SpringFramework"
- `(let ((,db (batis:create-sql-session *connection-pool*)))
- (handler-case
- (progn
- ,@body)
- (error (e)
- (progn
- (batis:rollback ,db)
- e))
- (:no-error (c)
- (batis:commit ,db)
- c))))
- ;; サービス層でこんな感じで使いたい
- (defun foo-service (&rest params)
- "this is service"
- (transactional (db)
- (check-parameters params)
- (register-user db params)
- (fetch-user db params)))
- ;; こんな感じでやりたいけど db っていうパラメータが見えなくなるのでちょっと嫌な感じ
- @Transactional
- (defun foo-service (&rest params)
- "this is service"
- (check-parameters params)
- (register-user db params)
- (fetch-usre db params))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement