2014-11-24 65 views
1

我有一個集成Spring,Hibernate和Apache DBCP的問題。我使用了hereDBCPConnectionProvider如何爲連接池配置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中創建兩個表。但我在我提到的DBCPConnectionProvider的getConnection()方法中獲得NullPointerException。這意味着dataSource沒有實例化。我想我已經在xml中配置了一切。我錯過了什麼。如何使用Spring和Hibernate配置DBCP 1.4版本?請提供您的見解。

這裏是堆棧跟蹤:

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.dbcphibernate.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和Spring的信息,我建議參考指南this section

+0

謝謝。但是,我聽說BasicDataSource又名dbcp直接不支持hibernate。所以,我們需要一個實現ConnectionProvider接口的類。我錯了嗎? – phoenix 2014-11-24 10:45:33

+0

不,你不知道。你可以使用任何你喜歡的數據源......你不需要連接提供者。不建議使用hibernate的內部池,因爲它們在自己的文檔中聲明。只需注入數據源即可滿足您的所有需求。 – 2014-11-24 10:54:16

+0

@ M.Denium好的。我試過配置。但是,當應用程序啓動時,我在mysql工作臺中看不到8個連接。 2已經默認存在。當應用程序啓動時,我期待2 + 8連接。但數字是另一回事。 – phoenix 2014-11-24 10:57:09

相關問題