Advertisement
Guest User

Untitled

a guest
Aug 21st, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.29 KB | None | 0 0
  1. ;; connection pool
  2. (defvar *connection-pool* nil)
  3.  
  4. ;; アプリケーションサーバが立ち上がるときに実行
  5. (defun init-database (driver-name &rest params &key database-name &allow-other-keys)
  6. "initialize database"
  7. (setf *connection-pool* (apply #'dbi-cp:make-dbi-connection-pool driver-name params)))
  8.  
  9. ;; アプリケーションサーバ終了時に実行
  10. (defun shutdown-database ()
  11. (dbi-cp:shutdown *connection-pool*))
  12.  
  13. ;; こんな感じのマクロを定義
  14. (defmacro transactional ((db) &body body)
  15. "transactional macro like SpringFramework"
  16. `(let ((,db (batis:create-sql-session *connection-pool*)))
  17. (handler-case
  18. (progn
  19. ,@body)
  20. (error (e)
  21. (progn
  22. (batis:rollback ,db)
  23. e))
  24. (:no-error (c)
  25. (batis:commit ,db)
  26. c))))
  27.  
  28.  
  29. ;; サービス層でこんな感じで使いたい
  30. (defun foo-service (&rest params)
  31. "this is service"
  32. (transactional (db)
  33. (check-parameters params)
  34. (register-user db params)
  35. (fetch-user db params)))
  36.  
  37.  
  38. ;; こんな感じでやりたいけど db っていうパラメータが見えなくなるのでちょっと嫌な感じ
  39. @Transactional
  40. (defun foo-service (&rest params)
  41. "this is service"
  42. (check-parameters params)
  43. (register-user db params)
  44. (fetch-usre db params))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement