mysql使用druid1.0.9的时候关闭连接的问题

heyu200709 发布于 2015/02/05 17:09
阅读 716
收藏 0

@wenshao 你好,想跟你请教个问题:

我项目中用druid1.0.9连接mysql5.x数据库,执行sql后关闭连接阻塞住了,有时阻塞住900多秒,


执行sql语句如下

        Connection conn = dbPool.getConnection();
        PreparedStatement pstmt = null;
        
        try {
            if(conn == null){
                logger.error("no connection found..");
                return false;
            }
            conn.setAutoCommit(true);
            pstmt = conn.prepareStatement(sqlStr);
            if(!StringHelper.isEmptyArray(param)){
                for(int i = 0,len = param.length;i<len;i++){
                    pstmt.setObject(i+1, param[i]);
                }
            }
            pstmt.execute();
        } catch (SQLException e) {
            StringBuffer expInfo = new StringBuffer("sql执行失败");
            if(param != null){
                expInfo.append(",param:").append(ArrayUtils.toString(param));
            }
            expInfo.append("");
            logger.error(expInfo.toString());
            throw new Exception(sql,"数据库插入或更新失败",e,ArrayUtils.toString(param));
        }finally{
            try {
                if(pstmt != null){
                    pstmt.close();
                }
                if(conn != null){
                    conn.close();   //---里有问题阻塞住
                }
            } catch (SQLException e) {
                e.printStackTrace();
                logger.error(new StringBuffer("sq执行后释放连接失败"));
            }
        }


dbpool 如下:


public class DBPool implements DBPool{
    private DruidDataSource ds;
    public PayagentDBPool(Properties p) throws PropertyVetoException, SQLException{
        ds = new DruidDataSource();
        ds.setName("mysql");
        ds.setUsername(p.getProperty("jdbc.username"));
        ds.setPassword(p.getProperty("jdbc.password"));
        ds.setUrl(p.getProperty("jdbc.url"));
        ds.setDriverClassName(p.getProperty("jdbc.driverClassName"));
        ds.setInitialSize(Integer.parseInt(p.getProperty("jdbc.pool.initialPoolSize")));
        ds.setMinIdle(Integer.parseInt(p.getProperty("jdbc.pool.minPoolSize")));
        ds.setMaxActive(Integer.parseInt(p.getProperty("jdbc.pool.maxPoolSize")));
        ds.setMaxWait(10000);
        ds.setQueryTimeout(10);
        ds.setTimeBetweenEvictionRunsMillis(120000);
        ds.setMinEvictableIdleTimeMillis(60000);
        ds.setValidationQuery("select 'x' from dual");
        ds.setTestOnBorrow(false);
        ds.setTestOnReturn(false);
        ds.setTestWhileIdle(true);
        ds.setPoolPreparedStatements(false);
        ds.setFilters("stat");
        ds.init();
    }

    public Connection getConnection() throws DBAccessException{
        Connection conn = null;
        if(ds != null){
            try {
                conn = ds.getConnection();
            } catch (SQLException e) {
                throw new Exception("获取数据库连接失败",e,"");
            }
        }
        return conn;
    }
    @Override
    public void close() {
        if(ds != null){
            ds.close();
        }
    }
}

请教 这里为什么会出现这种情况,不甚感激。


加载中
0
wenshao
wenshao
很奇怪,能够把stackTrace贴出来么?
heyu200709
heyu200709
奇怪的是 跑了900多秒 没有异常抛出,执行结果是正常的,求帮看看执行sql那段有什么问题,有可能导致阻塞,或配置有什么问题吗,谢谢温少。。。。。
返回顶部
顶部