如何为连接池配置Hibernate,Spring和Apache dbcp? [英] How to configure Hibernate, Spring and Apache dbcp for connection pooling?

查看:115
本文介绍了如何为连接池配置Hibernate,Spring和Apache dbcp?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个集成Spring,Hibernate和Apache DBCP的问题。我使用了这里的 DBCPConnectionProvider

我对以上所述的xml配置如下所示。

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

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

< property name =configurationClassvalue =org.hibernate.cfg.AnnotationConfiguration/>

< property name =hibernateProperties>
<道具>
< 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>

<! - 连接池相关属性 - >

< 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>
< /道具>
< / property>
< / bean>

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

当数据库模式(即 app )为空两个表将在mysql中创建。但是我在前面提到的 DBCPConnectionProvider 的getConnection()方法中得到了 NullPointerException 。这意味着dataSource没有实例化。我想我已经在xml中配置了一切。我错过了什么。如何使用Spring和Hibernate配置DBCP 1.4版本?请提供您的见解。

以下是堆栈跟踪:

 产生的原因:在org.hibernate.connection.DBCPConnectionProvider.getConnection显示java.lang.NullPointerException 
(DBCPConnectionProvider.java:209)在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)
。在org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
处org.springframework org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1326)
。 orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555)
... 82 more


解决方案

不要这样做。配置你想在Spring和Hibernate中使用的数据源。沟通 hibernate.dbcp hibernate.connection 属性。

 < bean id =dataSourceclass =org.apache.commons.dbcp.BasicDataSourcedestroy-method =靠近> 
< property name =driverClassNamevalue =com.mysql.jdbc.Driver/>
< property name =urlvalue =jdbc:mysql:// localhost:3306 / app/>
< property name =usernamevalue =foo/>
< property name =passwordvalue =bar/>
//其他DBCP属性在这里
< / bean>

< bean id =sessionFactoryclass =org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean>
< property name =dataSourceref =dataSource
< property name =packagesToScan>
< list>
<值> com.my.app.model< /值>
< / list>
< / property>
< property name =hibernateProperties>
<道具>
< prop key =hibernate.dialect> org.hibernate.dialect.MySQLDialect< / prop>
< prop key =hibernate.show_sql> true< / prop>
< prop key =hibernate.hbm2ddl.auto> update< / prop>
< /道具>
< / property>
< / bean>

只需将 dataSource 属性添加到 AnnotationSessionFactoryBean 作为依赖关系并完成。注意你不需要 configurationClass 属性,因为它已经是基于注解的。



我不会提示建议再使用Commons-DBCP作为数据源,而不是将 HikariCP 作为更好的数据源实现。 / p>

有关集成/配置Hibernate与Spring的更多信息,我建议 rel =nofollow>本节

I have a problem integrating Spring, Hibernate, and Apache DBCP. I have used the DBCPConnectionProvider from here.

I have the following xml configuration for the above said.

<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>

When the database schema i.e. app is empty two tables will be created in mysql. But I am getting NullPointerException in the getConnection() method of the DBCPConnectionProvider that I mentioned. That means the dataSource is not instantiated. I think I have configured everything in the xml. What am I missing. How do you configure DBCP version 1.4 with Spring and Hibernate? Please provide your insights.

Here is the stack trace:

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

解决方案

Don't do it like that. Configure the datasource you want to use in Spring as well as Hibernate. Ditch the hibernate.dbcp and hibernate.connection properties.

<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>

Just add the dataSource property to your AnnotationSessionFactoryBean as dependency and done. Note you don't need the configurationClass property as it is already annotation based.

A tip I wouldn't suggest using Commons-DBCP anymore as a datasource instead take a look at HikariCP as a better datasource implementation.

For more information in integrating/configuring Hibernate with Spring I suggest this section of the Reference Guide.

这篇关于如何为连接池配置Hibernate,Spring和Apache dbcp?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆