在春天,我有一个以这种方式定义的数据源:
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="URL" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="connectionCachingEnabled" value="true"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
这个数据源由我的REST服务使用,一切正常......无论如何,第一次REST调用非常慢(约5秒),之后每个其他调用都很快。
我认为这是一个与初始化相关的问题,因为在收到第一个DB调用时会进行初始化。 有没有办法告诉spring在服务器启动时初始化这个数据源?
答案 0 :(得分:1)
我认为这是一个与初始化相关的问题,在某种意义上说 在收到第一个DB调用时进行初始化。
使用您当前的配置,我认为这是正在发生的事情。
有没有办法告诉spring在服务器上初始化这个数据源 启动?
这是连接池的行为,而不是Spring。 Spring会在你的应用程序启动时创建bean(你没有在bean上使用lazy-init="true"
)。但是,当Spring实例化时,连接池不会创建与数据库的连接。来自Oracle docs:
初始池大小属性指定可用的数量 最初连接池时创建的连接 创建或重新初始化。此属性通常用于减少 将游泳池灌注到最佳尺寸所产生的加速时间。
值为0表示未预先创建任何连接。该 默认值为0.
尝试为initialPoolSize
设置非零值。
修改:请尝试设置ConnectionCacheProperties:
<property name="connectionCacheProperties">
<props merge="default">
<prop key="InitialLimit">5</prop>
</props>
</property>