Wydaje się, że mam wyciek pamięci, jednym z winowajców wydaje się być ConnectionProperty, bez względu na to, czy jest to String, Int czy Boolean. np .: com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
, miliony wydają się przebywać w pobliżu i nie być GC'd.
Oto moje ustawienia dla DB, fabryki sesji Hibernate oraz łączenie itd ..:
<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>
punktu przekroju wynosi:. „Wykonanie (* com.package.data .. (..)) ". Zmodyfikowałem wszelkie oczywiste nazwy itp.
Tak jak mówię, właśnie dostajemy setki takich na kupie, które nie są zbierane, i nie mam pojęcia, dlaczego i gdzie zacząć szukać.
Aplikacja jest wdrażana przez WAR, ze sterownikiem DB znajdującym się we współużytkowanym katalogu lib Tomcats. Używamy Tomcat6 lub tcServer, ale oba mają te same problemy.
Jakieś pomysły?
Każde połączenie ma 40-50 ustawialnych właściwości i trzymasz co najmniej 20 z nich, dlaczego jest to zaskakujące? Czy faktycznie rośnie bez ograniczeń, gdy maszyna pozostaje w górze, czy jest stabilna w "setkach na setkach"? Używanie dużej ilości pamięci to nie to samo, co wyciekanie pamięci. – Affe
FWIW, widzę ten sam problem na zupełnie innym silniku aplikacji (WebCluster). Tysiące klas MySQL ConnectionPropertiesImpl zagnieżdżonych w każdym cyklu naszego obiektu interfejsu SQL. –