并发20时 com.alibaba.druid.pool.DataSourceDisableException 求解

Nick_路 发布于 2013/05/06 13:10
阅读 4K+
收藏 1
public class BaseDao extends JdbcTemplate {
	private static Logger logger = Logger.getLogger(BaseDao.class);
	private ProcParam callParam = null;
	private Connection connection;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.sunsoft.web.dao.IBasedAO#setDataSource(javax.sql.DataSource)
	 */
	@Override
	@Resource(name = "dataSource")
	public void setDataSource(DataSource dataSource) {
		super.setDataSource(dataSource);
	}

	/**
	 * 调用存储过程
	 * 
	 * @param name
	 *            存储过程名称
	 * @param param
	 *            存储过程调用参数
	 * @return 存储过程调用结果
	 */
	public IProcResult callProc(final String sql, final IProcParam param) {
		if (param instanceof ProcParam) {
			callParam = (ProcParam) param;
			logger.debug(sql);
			logger.debug(callParam);
		} else {
			logger.error("Parameter is not correct!");
			return null;
		}
		try {
			// 返回结果
			ProcResult result = null;
			// 获得链接对象
			connection = super.getDataSource().getConnection();
			CallableStatement cstmt = connection.prepareCall(sql);
			// 填充参数
			callParam.fillParam(cstmt);

			cstmt.execute();
			// 省略处理结果集代码
			ResultSet resultSet = cstmt.getResultSet();
	                result.resultSetList.add(resultSetToArray(resultSet));

			cstmt.close();
			return result;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} 
	}
}

配置如下:


    <beans:bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">  
	    <beans:property name="driverClassName" value="${db.driver.class}"/>
	    <beans:property name="url" value="${db.url}" />
	    <beans:property name="username" value="${db.username}" />
	    <beans:property name="password" value="${db.password}" />  
	    <beans:property name="filters" value="stat"/>    
	    <beans:property name="maxActive" value="${proxool.maxActive}" />  
	    <beans:property name="initialSize" value="${proxool.initialSize}" />    
	    <beans:property name="maxWait" value="${proxool.maxWait}" /> 
	    <beans:property name="minIdle" value="${proxool.minIdle}" />   
	    <beans:property name="timeBetweenEvictionRunsMillis" value="${proxool.timeBetweenEvictionRunsMillis}" /> 
	    <beans:property name="minEvictableIdleTimeMillis" value="${proxool.minEvictableIdleTimeMillis}" />   
	    <beans:property name="validationQuery" value="SELECT 1" /> 
	    <beans:property name="testWhileIdle" value="true" />   
	    <beans:property name="testOnBorrow" value="false" /> 
	    <beans:property name="testOnReturn" value="false" />    
	    <beans:property name="poolPreparedStatements" value="true" />  
	    <beans:property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> 
	</beans:bean>


properties:

proxool.maxActive=500
proxool.initialSize=10
proxool.maxWait=60000
proxool.minIdle=10
proxool.timeBetweenEvictionRunsMillis=3000
proxool.minEvictableIdleTimeMillis=300000
db.driver.class=com.mysql.jdbc.Driver
db.url=jdbc:mysql://*********
db.username=****
db.password=****

错误如下:

以下是问题补充:

@Nick_路:错误日志以及报错位置已经贴出来了. (2013/05/06 13:36)
加载中
0
0x0001
0x0001

引用来自“_____小路”的答案

难道.. 我要用其他的方式关闭连接么?

你这样写试试看

public IProcResult callProc(final String sql, final IProcParam param) {
	Connection connection = null;
	if (param instanceof ProcParam) {
		callParam = (ProcParam) param;
		logger.debug(sql);
		logger.debug(callParam);
	} else {
		logger.error("Parameter is not correct!");
		return null;
	}
	try {
		// 返回结果
		ProcResult result = null;
		// 获得链接对象
		connection = super.getDataSource().getConnection();
		CallableStatement cstmt = connection.prepareCall(sql);
		// 填充参数
		callParam.fillParam(cstmt);

		cstmt.execute();
		// 省略处理结果集代码
		ResultSet resultSet = cstmt.getResultSet();
                <span></span>result.resultSetList.add(resultSetToArray(resultSet));

		cstmt.close();
		return result;
	} catch (SQLException e) {
		e.printStackTrace();
		return null;
	} finally {
		if(null != connection) {
			connection.close();	
		}
	}
}

Nick_路
Nick_路
thanks 貌似有用. 我再开loadrunner 压一下试试.
0
沉寂brain
沉寂brain
建议lz贴出详细的错误日志
0
Nick_路
Nick_路
@沉寂brain  错误日志 以及报错的位置已经贴出来了.. 求解!
0
0x0001
0x0001
表示没有看到finally关闭连接
0
Nick_路
Nick_路

引用来自“0x0001”的答案

表示没有看到finally关闭连接
close掉也是一样的.
0
Nick_路
Nick_路

引用来自“0x0001”的答案

表示没有看到finally关闭连接

这是关闭连接的异常:

0
Nick_路
Nick_路
难道.. 我要用其他的方式关闭连接么?
0
0x0001
0x0001

引用来自“_____小路”的答案

引用来自“0x0001”的答案

表示没有看到finally关闭连接
close掉也是一样的.
看上去是你自己多线程导致connection被覆盖的问题,好像connection是一个实例变量,可能dao也是单例的,请求1使用了请求2已经关闭的连接,
具体部分可能是在这里
connection = super.getDataSource().getConnection(); // 请求2设置这个connection,这里可能被其他线程覆盖
CallableStatement cstmt = connection.prepareCall(sql); // 在执行这部之前,这个connection 被另外一个线程关闭了
大胆猜测,可能不准确哈
0
wenshao
wenshao
你把连接池都关闭了,当然报告这样的错误啦!
5
523304708
回复 @Nick_路 : 咋解决的
Nick_路
Nick_路
已解决. thanks!
返回顶部
顶部