2013-05-14 85 views
0

我是Spring(yfying)我的應用程序,它使用Hibernate + C3P0作爲連接池。由於特定的原因,我使用託管的hibernate上下文。我正在使用實用程序類「HibernateUtil」進行會話處理。對於第一次遷移到Spring,我創建了一個ApplicationContext並在HibernateUtil中檢索了一個SessionFactory bean,替換了用於構建SessionFactory的代碼。當我從我的舊的hibernate.cfg.xml在春天的一切完全創建一個會話工廠bean按預期工作:將Hibernate管理的C3P0池遷移到Spring管理

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

    <property name="configLocation" value="classpath:config/hibernate.cfg.xml"></property> 

    </bean> 

的hibernate.cfg.xml

<hibernate-configuration> 

<session-factory> 

<property name="connection.username">user</property> 
    <property name="connection.url">jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull</property> 
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 
    <property name="connection.password">pass</property> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.max_fetch_depth">3</property> 
    <property name="hibernate.current_session_context_class">org.hibernate.context.ManagedSessionContext</property> 
    <property name="hibernate.transaction.auto_close_session">false</property> 


    <property name="hibernate.cache.region.factory_class"> 
     net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory</property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> 

    <!-- configuration pool via c3p0--> 

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
    <property name="connection.isolation">2</property> 

    <property name="hibernate.c3p0.acquire_increment">3</property> 
    <property name="hibernate.c3p0.idle_test_period">120</property> <!-- seconds --> 
    <property name="hibernate.c3p0.max_size">100</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.min_size">3</property> 
    <property name="hibernate.c3p0.timeout">1800</property> 

    <!-- mapping files --> 
    ....... 

如果我外部化連接池(我也從hibernate.cfg.xml中刪除所有的連接設置),我的交易無法正常工作。

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="${db.driver}"/> 
    <property name="jdbcUrl" value="${db.url}"/> 
    <property name="user" value="${db.user}"/> 
    <property name="password" value="${db.pass}"/> 

    </bean> 

     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource"/> 
     <property name="configLocation" value="classpath:config/hibernate.cfg.xml"></property> 

     </bean> 

我已經試過指定hibernate.transaction.factory_class動人休眠屬性的Spring bean配置,而不是使用hibernate.cfg.xml的一切都是徒勞的。我還不能完全切換到Spring Transaction管理。

回答

1

Imho您應該嘗試將所有內容移至Spring。根據我的經驗,當它混淆時,會遇到很多問題。有沒有你爲什麼還不能設置使用Spring管理的事務管理一個特別的原因:

<!-- Transaction Management --> 
    <tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/> 
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

從你的描述還是比較難治,找出與交易或與SessionFactory的正是問題是發生是它? 在hibernateProperties之外使用dataSource時,可能會導致sessionFactory問題的另一點是,Hibernate正在使用的ConnectionProvider實現正在改變。如果您指定dataSource休眠將使用DataSourceConnectionProviderhttp://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/connection/DatasourceConnectionProvider.html)而將數據源設置爲休眠配置休眠將使用DriverManagerConnectionProviderhttp://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/connection/DriverManagerConnectionProvider.html) 這兩者之間的差異可能是導致問題的原因。

+0

傳統代碼,全部代碼中的所有服務的單例模式,自定義安全性的自定義Web框架。感謝您指出確切的區別 – user979051 2013-05-16 01:58:54