Mysql 在分布式系统中终止会话的正确方法

Mysql 在分布式系统中终止会话的正确方法,mysql,session,shutdown,dropwizard,broken-pipe,Mysql,Session,Shutdown,Dropwizard,Broken Pipe,我正在开发一个分布式java项目,它使用AKKA框架并在dropwizard服务器上运行。我在应用程序启动时创建一个会话,并通过以下方式在所有参与者中使用该会话 final SessionFactory actorSessionFactory = hibernate.getSessionFactory() MyApplication.java public void run() { final Session actorSession = hibernate.getSess

我正在开发一个分布式java项目,它使用AKKA框架并在dropwizard服务器上运行。我在应用程序启动时创建一个会话,并通过以下方式在所有参与者中使用该会话

final SessionFactory actorSessionFactory = hibernate.getSessionFactory()
MyApplication.java

    public void run() {
      final Session actorSession = hibernate.getSessionFactory()
            .openSession();
     // pass this session to various actors
      final ActorSystem system = ActorSystem.create("myActorSystem");
      environment.lifecycle().manage(new ActorSystemGuardian(system));

      system.registerOnTermination(new Runnable() {
            public void run() {
            //Clean all resources after actor termination
            actorSession.close();
        }
ActorSystemGuardan.java

  public class ActorSystemGuardian implements Managed {
    private ActorSystem system;
    public ActorSystemManager(ActorSystem system) {
      this.system = system;
    }

    public void start() throws Exception {

    }

    public void stop() throws Exception {
      system.shutdown();

   }
}


这是否确保所有资源的正确清洁?actorSession会关门吗?在应用程序的整个生命周期中,所有参与者都需要使用相同的会话。有没有办法使此会话持久化?

我通过以下方式传递sessionFactory而不是会话来修复此问题

final SessionFactory actorSessionFactory = hibernate.getSessionFactory()
然后可以使用此工厂生成临时会话,这些会话在使用后可以(应该)关闭

system.registerOnTermination(new Runnable() {
        public void run() {
        //Clean all resources after actor termination

    }
仅当参与者系统关闭且不应与会话绑定时,才会调用system.registerOnTermination(new Runnable)