【问题标题】:Configuring the built-in c3p0 pooling in Hibernate using Spring使用 Spring 在 Hibernate 中配置内置的 c3p0 池
【发布时间】:2011-07-30 01:27:27
【问题描述】:

我了解到要在 hibernate 中配置 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 配置了 Hibernate。当我尝试在下面做时,它不起作用:

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

我已经阅读了有关使用可以使用 Spring 配置的独立 c3p0 池的信息,但是有什么方法可以使用 Spring 在 Hibernate 中配置内置的 c3p0 池?

启发我,因为我是初学者。

【问题讨论】:

    标签: java hibernate spring c3p0


    【解决方案1】:

    在 spring 配置中,您使用的是 dbcp 而不是 cp30。 Spring 正在创建数据源/连接池的实例。要为 dbcp 配置类似的参数,请直接设置它们的属性

    <property name="maxActive" value="5"/>
    <property name="minIdle" value="2"/>
    

    等等。您可以通过查看 BasicDataSource 的 javaodoc 或配置页面 http://commons.apache.org/dbcp/configuration.html 来了解可用的属性。

    【讨论】:

      【解决方案2】:

      这是一个关于如何在数据源中配置 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 负责池化,那么您需要配置 Session 属性:

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

      您必须使用其中一种方法:数据源池或休眠会话池。永远不要同时使用这两种方法,因为它会浪费资源。

      【讨论】:

      • 与 spring 一起使用时,让 hibernate 直接管理连接可能不是一个好主意。这可能不太适合 Spring 事务管理。
      • 如果我使用第一种方法,是否需要将任何外部工件包含到类路径中?
      • 顺便说一下,我使用了第二种方法,效果很好。非常感谢
      • 要使用第一种方法,您需要在类路径中添加 c3p0 jar。
      • @Soronthar 嗯...我也尝试了这两种方法,第一种(在数据源中配置)显然有效,基于控制台调试输出。但是,使用第二种方法,我没有得到任何输出来说服我 c3p0 已激活......我启用了 spring 的事务管理,而且我的配置中没有以下道具:
      猜你喜欢
      • 2012-08-31
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多