Hibernate会话在启动时未初始化

时间:2014-02-24 16:14:25

标签: java spring web-services hibernate

我在spring(DB2,C3P0)

中使用了hibernate模板

应用程序启动但未打开连接。 在客户端c3p0初始查询后,init启动并实际打开连接。但是这需要2-3秒才能在自己的创业过程中慢慢降低第一个客户端的速度。

如何在启动时强制hibernate打开db?

代码[编辑]

  <bean id=hibernateproperties >
<property name="properties">
    <props>
     <prop key="hibernate hbm2ddl|dialect|query.substitutions|show_sql </prop>
     <prop key="hibernate.c3po.minPoolSize">1</prop>
     <prop key="hibernate.c3po.maxPoolsize">5</prop>
     <prop key="hibernate.c3po.timeout">500</prop>
     <prop key="hibernate.c3po.max_statements">50</prop>
     <prop key="hibernate.c3po.testconnectionOnCheckout">true</prop>
     <prop key="hibernate.c3po.minActive">1</prop>
</property>
</bean>
<bean id=sessionfactory 
    class=AnnotationSessionFactory 
    properties=hibernateproperties 
    dataSource=c3p0dataSource>
    <property name="packagesToScan" >
        <list>
            <value>myPackages</value>
        </list>
    </property>
</bean>

在日志中没有初始化c3p0直到我手动创建查询。

[编辑] 我调试代码,当调用SessionFactory.getSession()时,它会发现根本没有创建会话并使用c3p0初始化会话。在实际查询之前有日志行 初始化c3p0池(带有类和选项)。 我猜AnnotationSessionFactory对会话init使用惰性方法。

注意: 我将spring lazy bean init设置为false

1 个答案:

答案 0 :(得分:0)

c3p0似乎不支持热身。因此,可能的选择之一是将c3p0配置为永不关闭少量连接,并在应用程序启动时进行手动预热。

您可能需要设置maxIdleTimeExcessConnections选项,以便c3p0关闭额外的空闲连接并将minPoolSize设置为某个较小的值(默认值为3)。

使用任何方法执行后期初始化操作:beans post processor,任何start-up callbacks依赖于dataSource。

此操作应该打开连接然后关闭它:这将创建一个(或更多取决于c3p0 acquireIncrement参数)连接并将其放回池中。以下是使用@PostConstruct注释的示例:

@Service
class C3P0Warmer {
  @Autowired DataSource dataSource;

  @PostConstruct
  public warmup() {
      JdbcUtils.closeConnection(dataSource.getConnection()); 
  }
}