#java #hibernate #spring #c3p0
#java #переход в режим гибернации #spring #c3p0
Вопрос:
Я узнал, что для настройки пула c3p0 в режиме гибернации мы можем записать конфигурацию в hibernate.cfg.xml например, это:
<property name="hibernate.c3p0.min_size">2</property>
<property name="hibernate.c3p0.max_size">5</property>
<property name="hibernate.c3p0.timeout">600</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
Однако я настроил режим гибернации с использованием Spring. Когда я попытался сделать ниже, это не сработало:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/news_loader" />
<property name="username" value="blah" />
<property name="password" value="blah" />
<property name="hibernate.c3p0.min_size" value="2" />
<property name="hibernate.c3p0.max_size" value="5" />
<property name="hibernate.c3p0.timeout" value="600" />
<property name="hibernate.c3p0.max_statements" value="0" />
<property name="hibernate.c3p0.idle_test_period" value="300"/>
<property name="hibernate.c3p0.acquire_increment" value="1" />
</bean>
Я читал об использовании автономного пула c3p0, который можно настроить с помощью Spring, но есть ли какой-либо способ настроить встроенный пул c3p0 в режиме гибернации с использованием Spring?
Просветите меня, потому что я новичок.
Ответ №1:
Вот пример конфигурации (из нашего приложения) о том, как настроить c3p0 в источнике данных:
<bean id="dataSourceGlobal" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${driver}" />
<property name="jdbcUrl" value="${server}" />
<property name="user" value="${user}" />
<property name="password" value="${passw}" />
<!-- these are C3P0 properties -->
<property name="acquireIncrement" value="${acquireIncrement}" />
<property name="minPoolSize" value="${minPoolSize}" />
<property name="maxPoolSize" value="${maxPoolSize}" />
<property name="maxIdleTime" value="${maxIdleTime}" />
</bean>
Мы используем внешний файл свойств для настройки некоторых параметров, но их также можно настроить непосредственно в Spring.
Если вы хотите, чтобы hibernate позаботился о пуле, вам необходимо настроить свойства сеанса:
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<!--suppress InjectionValueTypeInspection -->
<property name="mappingResources" ref="hibernateMappingList" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop>
<prop key="transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</prop>
<prop key="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
<prop name="hibernate.c3p0.min_size" value="2" />
<prop name="hibernate.c3p0.max_size" value="5" />
<prop name="hibernate.c3p0.timeout" value="600" />
<prop name="hibernate.c3p0.max_statements" value="0" />
<prop name="hibernate.c3p0.idle_test_period" value="300"/>
<prop name="hibernate.c3p0.acquire_increment" value="1" />
</props>
</property>
</bean>
Вы должны использовать один из подходов: либо пул в источнике данных, либо пул в сеансе гибернации. Никогда не используйте оба, так как это приводит к пустой трате ресурсов.
Комментарии:
1. При использовании с spring, вероятно, не стоит позволять hibernate напрямую управлять подключениями. Вероятно, это не будет хорошо сочетаться с управлением транзакциями spring.
2. Если я использую первый метод, нужно ли мне включать какой-либо внешний артефакт в путь к классу?
3. Кстати, я использовал второй метод, и он хорошо работает. Большое спасибо
4. Для использования первого метода вам понадобится jar c3p0 в вашем classpath.
5. @Soronthar Хм… Я также попробовал оба этих подхода, и первый (настройка в источнике данных), очевидно, работает, основываясь на выводе отладки консоли. Однако при втором подходе я не получаю никаких выходных данных, которые убедили бы меня в том, что c3p0 активирован… Я включил управление транзакциями spring, а также у меня нет следующих реквизитов в моей конфигурации:
Ответ №2:
В конфигурации spring вы используете dbcp вместо cp30. Spring создает экземпляр источника данных / пула соединений. Чтобы настроить аналогичные параметры для dbcp, задайте их свойства напрямую
<property name="maxActive" value="5"/>
<property name="minIdle" value="2"/>
и т.д. Вы можете узнать о доступных свойствах, просмотрев javaodoc для BasicDataSource или со страницы конфигурации http://commons.apache.org/dbcp/configuration.html.