2010-10-14 26 views
8

Tôi dường như có một rò rỉ bộ nhớ, một trong những thủ phạm có vẻ là ConnectionProperty, cho dù đó là String, Int hoặc Boolean. ví dụ: com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty, hàng triệu người dường như ở lại và không bị GC.

Dưới đây là các thiết lập của tôi cho DB, phiên Factory, Hibernate và Pooling vv ..:

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" 
     value="jdbc:mysql://${dbHostName}:${database.port}/${database.name}" /> 
    <property name="username" value="${database.username}" /> 
    <property name="password" value="${database.password}" /> 
</bean> 
<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<aop:config> 
      <aop:pointcut id="pcut" expression="execution(* com.package.data..*.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" ref="pcut" /> 
</aop:config> 
<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 


<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="current_session_context_class">thread</prop> 
      <prop key="cache.provider_class">org.hibernate.cache.NoCacheProvider</prop> 
      <prop key="hibernate.show_sql">false</prop> 
      <prop key="hibernate.connection.release_mode">after_transaction</prop> 

      <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 
      <prop key="c3p0.acquire_increment">1</prop> 
      <prop key="c3p0.min_size">20</prop> 
      <prop key="c3p0.max_size">200</prop> 
      <prop key="c3p0.timeout">300</prop> 
      <prop key="c3p0.max_statements">50</prop> 
      <prop key="c3p0.idle_test_period">300</prop> 

      <prop key="hibernate.generate_statistics">true</prop> 

     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      <value>...beans...</value> 
     </list> 
    </property> 
</bean> 

Các pointcut là:. "Thực thi (* com.package.data .. (..)) ". Tôi đã chỉnh sửa ra bất kỳ tên rõ ràng nào vv ..

Như tôi nói, chúng tôi chỉ nhận được hàng trăm thứ này trên đống mà không được thu thập và tôi không biết tại sao hoặc nơi bắt đầu tìm kiếm.

Ứng dụng được triển khai thông qua WAR, với trình điều khiển DB nằm trong thư mục lib được chia sẻ Tomcats. Chúng tôi đang chạy Tomcat6 hoặc tcServer, nhưng cả hai đều hiển thị cùng một vấn đề.

Bất kỳ ý tưởng nào?

+1

Mỗi kết nối có 40-50 thuộc tính có thể đặt trước và bạn đang nắm giữ tối thiểu 20 thuộc tính, tại sao điều này lại đáng ngạc nhiên? Nó có thực sự phát triển không bị ràng buộc khi máy vẫn hoạt động, hay nó ổn định ở "hàng trăm hàng trăm"? Sử dụng nhiều bộ nhớ không giống như bộ nhớ bị rò rỉ. – Affe

+0

FWIW, tôi thấy cùng một vấn đề trên một công cụ ứng dụng hoàn toàn khác (WebCluster). Hàng ngàn MySQL ConnectionPropertiesImpl các lớp lồng nhau bị rò rỉ trên mỗi chu kỳ của đối tượng giao diện SQL của chúng tôi. –

Trả lời

0

Hãy thử những hai:

  1. Set kết nối tổng hợp min/kích thước tối đa là 0 hoặc 1. Liệu nó vẫn phát triển?
  2. Tùy thuộc vào công cụ trình hồ sơ của bạn, hãy thử theo dõi đường dẫn từ một đối tượng đến gốc GC của nó.