我在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
答案 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());
}
}