спящие / ожидающие командные процессы из-за неправильной настройки базы данных tomcat + hibernate +
Я работаю над устаревшим кодом, и меня попросили выяснить, почему так многоsleeping /awaiting command
процессы вsql server db
, Большинство, если не все из них имеютprogram_name = 'jTDS'
, занимают много ресурсов CPU + Physical_io и старше 10 дней.
Чем больше я изучал, тем больше я осознавал, что это должно быть как-то связано с пулами баз данных.
Похоже, у нас есть 2 места, где мы используем пул db: • context.xml • applicationContext.xml При начальной загрузке приложения tomcat считывает файл web.xml, который в свою очередь принимает context.xml, и создает контейнер, содержащий разделяемое соединение базы данных ,
web.xml также принимает applicationContext.xml для получения контекстной информации о Spring.
Когда sessionFactory необходимо настроить параметр hibernate, он ищет свойства hibernateProperties.
context.xml
<Resource auth="Container" description="DAPS Database"
driverClass="net.sourceforge.jtds.jdbc.Driver"
name="jdbc/vda" user="****" password="*****"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
jdbcUrl="jdbc:jtds:sqlserver://localhost/dbname;user=sa;password=****;TDS=8.0" />
web.xml
<resource-ref>
<description>Pooled Database Resource</description>
<res-ref-name>jdbc/vda</res-ref-name>
<res-type>ja`vax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
applicationContext.xml
<!-- Data Source using C3P0 database connection pooling -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/vda</value>
</property>
</bean>
<!-- Hibernate properties to be used in the Session Factory -->
<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.c3p0.min_size">4</prop>
<prop key="hibernate.c3p0.max_size">10</prop>
<prop key="hibernate.c3p0.timeout">300</prop>
<prop key="hibernate.c3p0.max_statements">20</prop>
<prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
</props>
</property>
</bean>
<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties" ref="hibernateProperties" />
<property name="mappingResources">
<list>
<value>model/businessobject/login/User.hbm.xml</value>
</list>
</property>
</bean>
я добавилmaxActive="30" maxIdle="10" maxWait="3000"
вcontext.xml файл.
Я также добавил:
<prop key="hibernate.c3p0.maxIdleTime">1800</prop>
<prop key="hibernate.c3p0.idle_test_periods">30</prop>
в applicationContext.xml
Похоже, есть 2 места, где мы устанавливаем значения c3p0. Если это так, нужны ли нам оба?
Это где моя проблема? Кто-нибудь может увидеть что-то не так?