问题描述
昨天发的帖子可能描述的不是很清楚,今天整理了再发一次,求大师们帮忙看看,两个帖子一起结!1,应用一datasource配置<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="url" value="jdbc:oracle:thin:@192.168.249.50:1521:orcl"/> <property name="username" value="skxt"/> <property name="password" value="skxt"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="ds" /> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.dialect">com.eka.util.MyDialect</prop> <prop key="hibernate.c3p0.min_size">10</prop> <prop key="hibernate.c3p0.max_size">50</prop> <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 --> <prop key="hibernate.c3p0.timeout">1000</prop> <!-- 最大的PreparedStatement的数量 --> <prop key="hibernate.c3p0.max_statements">100</prop> <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 --> <prop key="hibernate.c3p0.acquire_increment">2</prop> <!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒--> <prop key="hibernate.c3p0.idle_test_period">120</prop> <!-- 每次都验证连接是否可用 --> <prop key="hibernate.c3p0.validate">false</prop> </props> </property> </bean> 2,应用一webservice调用public class FinanceClient {public String serviceClient(String methodName,String xml){try {Configuration objConfiguration=new Configuration();String Url=objConfiguration.getValue("finance_url");String Qname=objConfiguration.getValue("finance_qname"); Service service = new Service(); Call call = (Call) service.createCall(); // 设置调用服务地址 call.setTargetEndpointAddress(new java.net.URL(Url)); //此处一定要配置wsdl的namespace参数 找wsdl中 wsdl:definitions标签下的targetNamespace http://webservice.myself.gzticket.gmcc.com call.setOperationName(new QName(Qname, methodName)); //此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为null call.addParameter("linkNo",org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN); //如果设置类传入参数类型,此处也需要设置返回参数类型 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING); call.setUseSOAPAction(true); call.setSOAPActionURI(Url); String result = (String) call.invoke(new Object[] { xml }); return result;} catch (Exception e) {e.printStackTrace();return e.getMessage();}}}调用:new FinanceClient().serviceClient(xml);3,应用二 datasource配置:<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"> </property> <property name="url" value="jdbc:oracle:thin:@192.168.249.50:1521:orcl"> </property> <property name="username" value="netpay_0407" /> <property name="password" value="netpay_0407" /> </bean> 4,应用二 webserivice配置<!-- xfire相关配置 --> <bean id="webAnnotations" class="org.codehaus.xfire.annotations.jsr181.Jsr181WebAnnotations" lazy-init="false" /> <bean id="jsr181HandlerMapping" class="org.codehaus.xfire.spring.remoting.Jsr181HandlerMapping" lazy-init="false"> <property name="xfire" ref="xfire" /> <property name="webAnnotations" ref="webAnnotations" /> </bean> <!-- end xfire --> @Component @WebService(serviceName = "financeService", endpointInterface = "com.elis.finance.webService.IFinanceManager") public class FinanceManager implements IFinanceManager { @Autowired private PropJournalServiceImpl propJournalServiceImpl; @Autowired private BisJournalFileDirectProcess bisJournalFileDirectProcess; public String uploadVoucherToBis(String xml) { //调用应用二的数据库 mapper.proCreateSumVoucher();}}应用二的mapper调用:@Repositorypublic class PropJournalMapper {@Autowiredprivate SqlSessionTemplate sessionTemplate;public List<PropJournalDTO> proCreateSumVoucher() {return sessionTemplate.selectList("com.elis.finance.mapper.PropJournalMapper.proCreateSumVoucher);}说明:应用一是spring1.2+hibernate3,应用二是spring3x+myibatis,现在的情况是应用一,应用二单独使用没有任何问题(或者没有发现问题),当应用一使用webservice调用应用二的方法,一段时间后或者持续并发调用后,应用一出现线程池爆膨,其他功能无法连接到数据库(处于等待状态),webservice还是可以继续调用,使用正常,当在datasource配置上添加destory方法后,问题得到解决(或者伪解决),请帮忙看看问题所在
解决方案
从你的描述来看 1、就是webservice请求的太快造成拿到连接处理 但并没有很快释放2、webservice调用的代码没有释放连接怎么判断有没有释放连接:自己调用下webservice 然后调用完成后 看看连接池的连接释放了吗 如果没有说明【2】 否则就是【1】 增大连接池大小