2014-11-24 5 views
1

У меня есть проблема интеграции Spring, Hibernate и Apache DBCP. Я использовал DBCPConnectionProvider от here.Как настроить Hibernate, Spring и Apache dbcp для объединения пулов?

У меня есть следующая xml-конфигурация для вышеуказанного.

<context:component-scan base-package="com.my.app"/> 

<tx:annotation-driven/> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.my.app.model</value> 
     </list> 
    </property> 

    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/> 

    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 

      <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop> 
      <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/app</prop> 
      <prop key="hibernate.connection.username">foo</prop> 
      <prop key="hibernate.connection.password">bar</prop> 
      <prop key="hibernate.connection.provider_class">org.hibernate.connection.DBCPConnectionProvider</prop> 

      <!-- Connection pooling related properties --> 

      <prop key="hibernate.dbcp.initialSize">8</prop> 
      <prop key="hibernate.dbcp.maxActive">20</prop> 
      <prop key="hibernate.dbcp.maxIdle">5</prop> 
      <prop key="hibernate.dbcp.minIdle">0</prop> 
      <prop key="hibernate.dbcp.maxWait">10000</prop> 
      <prop key="hibernate.dbcp.minEvictableIdleTimeMillis">180000</prop> 
      <prop key="hibernate.dbcp.timeBetweenEvictionRunsMillis">180000</prop> 
      <prop key="hibernate.dbcp.testWhileIdle">true</prop> 
      <prop key="hibernate.dbcp.testOnReturn">true</prop> 
      <prop key="hibernate.dbcp.validationQuery">select 1</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

Когда схема базы данных, т.е. app пуст две таблицы будут созданы в MySQL. Но я получаю NullPointerException в методе getConnection() DBCPConnectionProvider, о котором я упоминал. Это значит, что dataSource не создается. Я думаю, что я настроил все в xml. Что мне не хватает. Как настроить DBCP версии 1.4 с помощью Spring и Hibernate? Пожалуйста, предоставьте свои идеи.

Вот трассировки стека:

Caused by: java.lang.NullPointerException 
    at org.hibernate.connection.DBCPConnectionProvider.getConnection(DBCPConnectionProvider.java:209) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417) 
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144) 
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:119) 
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57) 
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555) 
    ... 82 more 

ответ

4

Не делайте это так. Настройте источник данных, который вы хотите использовать как Spring, так и Hibernate. Отверните hibernate.dbcp и hibernate.connection.

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/app"/> 
    <property name="username" value="foo"/> 
    <property name="password" value="bar"/> 
    // Other DBCP properties here 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" 
    <property name="packagesToScan"> 
     <list> 
      <value>com.my.app.model</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 

Просто добавьте dataSource свойство вашего AnnotationSessionFactoryBean в зависимости и сделал. Обратите внимание, что вам не нужно свойство configurationClass, поскольку оно уже основано на аннотациях.

Совет Я бы не предложил использовать Commons-DBCP больше в качестве источника данных, а вместо этого взглянуть на HikariCP как на лучшую реализацию источника данных.

Для получения дополнительной информации по интеграции/конфигурации Hibernate с пружиной я предлагаю this section Справочного руководства.

+0

Спасибо. Но я слышал, что BasicDataSource aka dbcp напрямую не поддерживается спящим режимом. Таким образом, нам нужен класс, реализующий интерфейс ConnectionProvider. Я ошибаюсь? – phoenix

+0

Нет, нет. Вы можете использовать любой источник данных, который вам нравится ... Вам не нужен поставщик подключения. Также использование внутреннего объединения в спящий режим не рекомендуется для использования (как указано в их собственной документации). Просто введите источник данных, и это все, что вам нужно. –

+0

@ M.Denium Хорошо. Я попробовал конфигурацию. Но, когда приложение запускается, я вижу не 8 подключений в workbench mysql. 2 уже есть по умолчанию. Я ожидал 2 + 8 соединений, когда приложение запускается. Но число - это нечто другое. – phoenix

Смежные вопросы