2013-06-12 71 views
8

Tôi đã vấp phải một vấn đề trong khi phát triển một ứng dụng Web dựa trên Struts2 với Spring và Hibernate.Cấu hình Hibernate C3P0 Kết nối Pooling

Khi tôi làm mới trang web một vài lần, ví dụ 2-4 lần, Hibernate hiển thị ngoại lệ về Quá nhiều kết nối. Tôi đã cố gắng thực hiện C3P0 hồ bơi kết nối và có một số vấn đề với nó


Các hibernate.cfg.xml cấu hình:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/axelle</property> 
<property name="hibernate.connection.username">axelle</property> 
<property name="hibernate.connection.password">dbpassword</property> 
<property name="hibernate.current_session_context_class">thread</property>  

<property name="hibernate.c3p0.min_size">5</property> 
<property name="hibernate.c3p0.max_size">20</property> 
<property name="hibernate.c3p0.timeout">300</property> 
<property name="hibernate.c3p0.max_statements">50</property> 
<property name="hibernate.c3p0.idle_test_period">3000</property> 

applicationContext.xml

<bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
     p:location="classpath:jdbc.properties"/> 

<bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     p:driverClassName="${jdbc.driverClassName}" 
     p:url="${jdbc.url}" 
     p:username="${jdbc.username}" 
     p:password="${jdbc.password}" 
     p:connectionProperties="${jdbc.connectionProperties}"/> 

<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) --> 

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

<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory"/> 
    </property> 
</bean> 

Đầu ra nhật ký là:

org.hibernate.exception.JDBCConnectionException: Cannot open connection 

và:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 

Và đây là cách processlist cửa sổ MySQL trông: http://img844.imageshack.us/img844/3959/be69273cc2.png


tôi đã thiết MAX_SIZE các kết nối đến 20, nhưng nó có vẻ như nó doesn' t đọc cấu hình C3P0 từ tập tin, gây ra từ màn hình chúng ta có thể thấy rằng số lượng kết nối cao hơn 20, hoặc có thể tôi đang làm điều gì đó sai, nhưng ở đâu? Tôi thực sự cần một số người giúp đỡ, tôi sẽ đánh giá cao điều này, và cảm ơn trước.

+1

Bạn có thể đảm bảo rằng bạn đang đóng tất cả các kết nối mà bạn đang mở. Đó là nguyên nhân cơ bản của rò rỉ kết nối –

+0

Xin lỗi, nhưng đây là lần đầu tiên khi tôi cố gắng triển khai một nhóm Kết nối, bạn có thể tư vấn cách tôi cần đóng nó không? nhưng dù sao tôi đang cố gắng đóng tất cả các phiên sau khi truy vấn cơ sở dữ liệu với 'transaction.commit();' 'session.flush();' 'session.close();'. – Denees

+2

Tại sao bạn nghĩ rằng c3p0 là nhà cung cấp kết nối của bạn? –

Trả lời

12

Đề cập đến những tài sản trong file hibernate.cfg.xml bạn

<property name="hibernate.c3p0.acquire_increment">1</property> 
    <property name="hibernate.c3p0.idle_test_period">100</property> 
    <property name="hibernate.c3p0.max_size">10</property> 
    <property name="hibernate.c3p0.max_statements">10</property> 
    <property name="hibernate.c3p0.min_size">10</property> 
    <property name="hibernate.c3p0.timeout">100</property> 

Tham khảo link này để hiểu rõ hơn: Configuration Properties

+0

Giải pháp của bạn hoạt động tốt, cảm ơn vì điều đó :) – Denees

1

Trong applicationContext của bạn, thay vì sử dụng <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" ... hãy thử sử dụng <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" ... Các C3P0PooledDataSource sẽ tạo ra kết nối cơ sở dữ liệu được bao bọc bằng DriverClassName, url, tên người dùng và mật khẩu được chỉ định

Các vấn đề liên quan