Spring配置proxool连接池,并发50次出现死锁

悬赏:10 发布时间:2008-05-16 提问人:brian_wangshuaijie (初级程序员)

环境:
window2000
tomcat5.0
spring1.2

基本架构:
action=>services-dao
services有事务管理
dao类:

public class tabDAO extends HibernateDaoSupport implements ITabDAO {

public void update(){

StringBuffer sql = new StringBuffer();
sql.append("UPDATE Tab ");
sql.append("SET tabname = tabname + 1 ");
sql.append("WHERE tabid = '1' ");

this.getHibernateTemplate().bulkUpdate(sql.toString());
}

}

applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.spring_pro_pool</value>
</property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
destroy-method="close">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/pojo/Tab.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="connection.provider_class">
org.hibernate.connection.ProxoolConnectionProvider
</prop>
</props>
</property>
</bean>

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="tabDAO" class="com.dao.tabDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="services" class="com.services.Services">
<property name="tabDAO">
<ref bean="tabDAO" />
</property>
</bean>

<bean id="servicesTransactionProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="proxyInterfaces">
<list>
<value>com.services.IServices</value>
</list>
</property>
<property name="target">
<ref bean="services" />
</property>
<property name="transactionAttributes">
<props>
<prop key="update">
PROPAGATION_REQUIRED,-Exception
</prop>
</props>
</property>
</bean>

<bean name="/update" singleton="false"
class="com.action.UpdateAction">
<property name="servicesTransactionProxy">
<ref bean="servicesTransactionProxy" />
</property>
</bean>

</beans>



proxool.xml
<?xml version="1.0" encoding="utf-8"?>

<something-else-entirely>
<proxool>
<alias>spring_pro_pool</alias>
<driver-url>jdbc:oracle:thin:@localhost:1521:chenlong</driver-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="scott"/>
<property name="password" value="tiger"/>
</driver-properties>
<maximum-connection-count>50</maximum-connection-count> 
<minimum-connection-count>30</minimum-connection-count>
<simultaneous-build-throttle>200</simultaneous-build-throttle>
<maximumActiveTime>1000</maximumActiveTime>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
<statistics-log-level>INFO</statistics-log-level>
</proxool>
</something-else-entirely>



web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>



<!-- ##################### Proxool ####################### -->
<servlet>
<servlet-name>proxoolServletConfigurator</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator
</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/classes/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet>
<servlet-name>AdminP</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AdminP</servlet-name>
<url-pattern>/AdminP</url-pattern>
</servlet-mapping>

</web-app>

并发测试工具Jmeter2.3.1:
参数
线程数:50
Ramp-UP Period(in scerond):0
循环次数:1

测试结果:
出现多个如下异常:


org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute update query; uncategorized SQLException for SQL [update SCOTT.TAB set TABNAME=TABNAME+1 where TABID='1']; SQL state [62000]; error code [104]; ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源
; nested exception is java.sql.SQLException: ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源

org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute update query; uncategorized SQLException for SQL [update SCOTT.TAB set TABNAME=TABNAME+1 where TABID='1']; SQL state [62000]; error code [104]; ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源
; nested exception is java.sql.SQLException: ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源

java.sql.SQLException: ORA-00104: 检测到死锁;全部公用服务器已锁定等待资源

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)

在proxool网页控制台上
发现连接基本上都不释放


请问各位大虾,该如何解决??????????????

问题补充:
怎么没人补充罗
问题补充:
怎么没人给个答案落,
看来,遇到这个问题的人不多哦,
该问题已经关闭: 结贴
Ask Myask

答题高手

问题频道帮助