Grails:跨控制器的 SessionFactory 和 Session 对象

lud*_*_rj 0 grails

在 grails 服务中,我创建并管理一个用于从外部 API 调用方法的会话,使用 API 的会话工厂来启动连接:

1)Service Session对象(服务级别):

private final SessionFactory sessionFactory = SessionFactoryImpl.newInstance()
private Session session
Run Code Online (Sandbox Code Playgroud)

2)服务getSession方法调用

def getSession(Map conf) {
        if (session == null) {
            ...

            Object o = sessionFactory.getRepositories(params)
            session = o.createSession()
        }
        session
}
Run Code Online (Sandbox Code Playgroud)

3) 从控制器调用的服务连接器

def connect() {

<some logic>
        return session
    } 
Run Code Online (Sandbox Code Playgroud)

4)在控制器中,我使用以下命令检索会话对象:

def session = service.connect()
Run Code Online (Sandbox Code Playgroud)

一旦第一个连接创建了会话对象,在控制器之间(甚至在 grails 插件之外)共享它的最佳方式是什么?如何确保会话对象作为单例调用(即避免每个控制器的方法调用以重新初始化服务中的 sessionFactory 调用)?

小智 5

Grails 已经有一个SessionFactorybean,您只需声明它,依赖注入就会为您处理它。

关于控制器之间使用同一个会话,你将如何处理来自不同用户的并发请求?

一些想法:

  • 如果您的外部 API 有休眠类,您可以使用 xml 映射它们

  • 如果您的外部 API 需要 SessionFactory,只需在您的服务中声明它

  • 如果您需要当前会​​话,只需使用withSession

依赖注入示例:

class MyService {
  def sessionFactory
  ...
}
Run Code Online (Sandbox Code Playgroud)