【问题标题】:How to reload/recreate sessionFactory bean in spring mvc without refresh entire webapplication context?如何在spring mvc中重新加载/重新创建sessionFactory bean而不刷新整个Web应用程序上下文?
【发布时间】:2014-07-08 22:23:24
【问题描述】:

在带有休眠集成的春季,我有以下要求。 我需要重新加载/重新创建/刷新/更新唯一的 sessionFactory bean。

但是在使用的时候

((ConfigurableApplicationContext)ApplicationContextProvider.getApplicationContext()).refresh();

它重新加载整个应用程序上下文(所有 bean)。

能否请任何人帮助我根据某些条件(例如用户在 UI 级别选择/单击某个选项)仅重新加载一个 bean

谢谢你..

【问题讨论】:

  • 你如何注入或初始化会话工厂bean?请发布一些代码..
  • 请检查一次..org.hibernate.dialect.MySQLDialect等../../hbm/jobmaster.hbm.xml,etc..,----

标签: java spring hibernate spring-mvc


【解决方案1】:

这不是一个直接的答案,但我认为在应用程序上下文中重新加载一个新的SessionFactory而不使用它重新加载其他bean会导致严重的问题。 SessionFactory 通常是一个单例 bean,因此仅在上下文刷新时才使用它注入其他 bean。因此,即使您设法将新的 SessionFactory bean 放入应用程序上下文中,也没有 DAO 知道更改,甚至可以尝试使用封闭工厂...

如果你真的想刷新SessionFactory bean,你必须:

  • 关闭老豆
  • 新建一个
  • 小心地将其注入 所有 bean(通常是 DAO)中,这些 bean 使用它来模仿 spring 在刷新时所做的事情
  • 在所有 bean 都准备好之前,应该处理所有应该是“原子”(即没有请求)的东西。

这是您的应用程序,但在我看来,所有这些都容易出错。至少确保让维护者的红色闪烁 cmets ...

【讨论】:

    【解决方案2】:

    朋友。试试看~

    DefaultListableBeanFactory defaultListableBeanFactory =(DefaultListableBeanFactory) xmlWebApplicationContext.getBeanFactory();
            BeanDefinition beanDefinition = defaultListableBeanFactory.getBeanDefinition("pooledConnectionFactory");
            beanDefinition.setBeanClassName(PooledConnectionFactory.class.getName());
            defaultListableBeanFactory.registerBeanDefinition( "pooledConnectionFactory", beanDefinition);
    

    【讨论】:

    • 非常感谢您的建议,我能够重新加载 sessionFactory bean 并且我能够获得更新的 sessionFactory 实例,但它仍然在重新加载整个 web 应用程序上下文,因为我丢失了我以前的全部内容会话范围的数据(对象),并且由于我在进一步执行(流)中得到 NullPointer 异常。您能建议我进一步采取哪些步骤吗?...谢谢。
    • 嗨,伙计。如果单击ui,您更改了一次sessionfactory,那么在其他情况下是否需要更改回来?如果你需要改回你的 sessionfactory 。我建议你创建两个不同的 sessionfactory 。这是我的意见。
    猜你喜欢
    • 1970-01-01
    • 2012-09-09
    • 2014-09-03
    • 1970-01-01
    • 2011-06-21
    • 2011-09-17
    • 2019-04-05
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多