Я использую в своем приложении комбинацию двух подходов.Первый - это пул соединений c3p0, это почти то же решение, что и chkal sugested.Второй подход заключается в использовании Spring lazyConnectionDataSourceProxy, который создает ленивый загрузочный прокси, который загружает соединение, только если вы попали в базу данных.Это очень полезно, когда у вас есть кэш второго уровня, и вы только читаете кэшированные данные и запросы - база данных не будет повреждена, и вам не нужно устанавливать соединение (что довольно дорого).
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- Pool properties -->
<property name="minPoolSize" value="5" />
<property name="initialPoolSize" value="10" />
<property name="maxPoolSize" value="50" />
<property name="maxStatements" value="50" />
<property name="idleConnectionTestPeriod" value="120" />
<property name="maxIdleTime" value="1200" />
</bean>
<bean name="lazyConnectionDataSourceProxy" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource" ref="dataSource" />
</bean>