2014-02-24 30 views
0

我使用spring(DB2,C3P0)的休眠模板Hibernate会话在启动时未初始化

应用程序启动但连接未打开。 第一次从客户端c3p0进行查询后,init启动并实际打开连接。但是这需要2-3秒才能显示出在自己的启动过程中第一个客户端的速度变慢。

如何强制休眠在启动时打开数据库?

代码[编辑]

<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使用懒惰的方法。

注: 我设置的弹簧懒豆初始化为false

+1

代码在哪里? –

+0

你在服务器中使用它吗? –

+0

@AdamArold感谢您的支持。代码部分在某种程度上是不可见的。现在它应该被修复。 – pnemec

回答

0

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

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

使用任何方法来执行后期初始化操作:beans post processor,任何对数据源有依赖关系的start-up callbacks

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

@Service 
class C3P0Warmer { 
    @Autowired DataSource dataSource; 

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

c3p0甚至没有启动。因为我没有将它配置为独立的DataSource。 我将c3p0配置直接注入会话,它将处理数据源。不过,我使用完全相同的方法来请求触发初始化的会话 - 我认为这是一种黑客攻击并寻找更好的方法。 这是很好的提示。我会尝试让c3po成为独立的DS并试用。 – pnemec

相关问题