Spring+Hibernate 配置和使用c3p0和proxool连接池

本文介绍如何使用 Spring 进行 c3p0 和 proxool 数据源的配置,包括配置文件示例及通过 hibernateProperties 对 Hibernate 的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

其实原理都是一样 就是用一个继承了实现javax.sql.DataSource的DataSource类

在Spring中用bean来组装,管理 来配置其属性 提供给sessionFactory来组装

API上可能属性没有写出来 但是可以看到方法 要想真正了解 还是要看源代码中的详细属性

比如在cp30中这个具体的DataSource是

com.mchange.v2.c3p0.ComboPooledDataSource
他的源代码中有以下片段:

    .............
       public String getDriverClass()
    
return dmds.getDriverClass(); }

    
public void setDriverClass( String driverClass ) throws PropertyVetoException
    

        dmds.setDriverClass( driverClass ); 
//      System.err.println("setting driverClass: " + driverClass); 
    }


    
public String getJdbcUrl()
    
{  
//      System.err.println("getting jdbcUrl: " + dmds.getJdbcUrl()); 
        return dmds.getJdbcUrl(); 
    }


    
public void setJdbcUrl( String jdbcUrl )
    

        dmds.setJdbcUrl( jdbcUrl ); 
        
this.resetPoolManager( false );
//      System.err.println("setting jdbcUrl: " + jdbcUrl + " [dmds@" + C3P0ImplUtils.identityToken( dmds ) + "]"); 
//      if (jdbcUrl == null)
//      new Exception("*** NULL SETTER ***").printStackTrace();
    }


    
public Properties getProperties()
    

        
//System.err.println("getting properties: " + dmds.getProperties()); 
        return dmds.getProperties(); 
    }


    
public void setProperties( Properties properties )
    

        
//System.err.println("setting properties: " + properties); 
        dmds.setProperties( properties ); 
        
this.resetPoolManager(false);
    }


    
// DriverManagerDataSource "virtual properties" based on properties
    public String getUser()
    
return dmds.getUser(); }

    
public void setUser( String user )
    

        dmds.setUser( user ); 
        
this.resetPoolManager( false );
    }


    
public String getPassword()
    
return dmds.getPassword(); }

    
public void setPassword( String password )
    

        dmds.setPassword( password ); 
        
this.resetPoolManager( false );
................

里面有个property属性的get和set方法

因此在bean中可以对其进行配置

组装到sessionFactory中之后 还可以通过hibernateProperties对Hibernate进行一些配置 

一   c3p0

beas-config.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<!-- =================================================================== -->
<!-- JDBC dataSource                                                     -->
<!-- =================================================================== -->

<!-- ***********************************************************************
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>com.mysql.jdbc.Driver</value>
        </property>
        <property name="url">
            <value>jdbc:mysql://localhost:3306/shtest</value>
        </property>
        <property name="username">
            <value>root</value>
        </property>
        <property name="password">
            <value>password</value>
        </property>
    </bean>
************************************************************************ 
-->

<!-- =================================================================== -->
<!-- c3p0 dataSource                                                     -->
<!-- =================================================================== -->


    
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        
<property name="driverClass">
            
<value>com.mysql.jdbc.Driver</value>
        
</property>
        
<property name="jdbcUrl">
            
<value>jdbc:mysql://localhost:3306/shtest</value>
        
</property>
        
<property name="properties">
            
<props>
                
<prop key="c3p0.acquire_increment">2</prop>
                
<prop key="c3p0.idle_test_period">200</prop>
                
<prop key="c3p0.timeout">1000</prop>
                
<prop key="c3p0.max_size">100</prop>
                
<prop key="hibernate.c3p0.max_statements">100</prop>
                
<prop key="hibernate.c3p0.min_size">20</prop>
                
<prop key="user">root</prop> 
                
<prop key="password">password</prop>
            
</props>
        
</property>
    
</bean>

    
<!-- =================================================================== -->
<!-- Hibernate sessionFactory                                            -->
<!-- =================================================================== -->
    
    
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" destroy-method="close">
        
<property name="dataSource">
            
<ref bean="dataSource"/>
        
</property>
        
<property name="mappingResources">
            
<list>
                
<value>/com/ergal/hibernate/User.hbm.xml</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.current_session_context_class">thread</prop>
            
</props>
        
</property>
    
</bean>
    
<!-- =================================================================== -->
<!-- Hibernate POJO                                                      -->
<!-- =================================================================== -->
    
    
<bean id="userDao" class="com.ergal.hibernate.UserDao">
        
<property name="sessionFactory">
            
<ref bean="sessionFactory"/>
        
</property>
    
</bean>

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

<!-- =================================================================== -->
<!-- Dao Proxy                                                           -->
<!-- =================================================================== -->

    
<bean id="userDaoProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        
<property name="transactionManager">
            
<ref bean="transactionManager"/>
        
</property>
        
<property name="proxyInterfaces">
            
<list>
                
<value>com.ergal.hibernate.IUserDao</value>
            
</list>
        
</property>
        
<property name="target">
            
<ref bean="userDao"/>
        
</property>
        
<property name="transactionAttributes">
            
<props>
                
<prop key="insert">PROPAGATION_REQUIRED</prop>
            
</props>
        
</property>
    
    
</bean>



</beans>

 

这么一来在修改数据库连接的部分就变的非常简单 修改后也不用修改除sessionFactory的组装外的其他代码

二 proxool

这个可以通过对hibernateProperties的属性配置来设置

beans-config.xml

    <bean id="mySessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
        
<property name="mappingResources">
            
<list>
                
<value>com/meagle/bo/Order.hbm.xml</value>
                
<value>com/meagle/bo/OrderLineItem.hbm.xml</value>                
            
</list>
        
</property>        
        
        
<property name="hibernateProperties">
            
<props>
                
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
                
<prop key="hibernate.show_sql">true</prop>
                
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
                
<prop key="hibernate.proxool.xml">C:/....../WebContent/WEB-INF/proxool.xml</prop>
                
<prop key="hibernate.proxool.pool_alias">spring</prop>
            
</props>
        
</property>        
    
</bean>

 

然后单独写一个proxool.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<!-- the proxool configuration can be embedded within your own application's.
    Anything outside the "proxool" tag is ignored. 
-->

<proxool>
    
<alias>spring</alias>
    
<driver-url>jdbc:mysql://localhost:3306/shtest</driver-url>    
    
<driver-class>com.mysql.jdbc.Driver</driver-class>
    
<driver-properties>
        
<property name="user" value="root" />
        
<property name="password" value="password" />
    
</driver-properties>
    
<minimum-connection-count>2</minimum-connection-count>
    
<maximum-connection-count>20</maximum-connection-count>
    
<maximum-connection-lifetime>180000</maximum-connection-lifetime> <!-- 5 hours -->
    
<house-keeping-test-sql>values(current TimeStamp)</house-keeping-test-sql>
    
<statistics>1m,15m,1d</statistics>
    
<statistics-log-level>INFO</statistics-log-level>
    
<fatal-sql-exception>Connection is closed,SQLSTATE=08003,Error opening socket. SQLSTATE=08S01,SQLSTATE=08S01</fatal-sql-exception>
    
<fatal-sql-exception-wrapper-class>org.logicalcobwebs.proxool.FatalRuntimeException</fatal-sql-exception-wrapper-class>
    
<verbose>false</verbose>
</proxool>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值