开发者社区> 问答> 正文

C3P0 的一些被阻塞的线程:报错

@红薯 你好,想跟你请教个问题:用jconsole查看到网站的线程情况,发现大量c3p0线程被阻塞,如下:

名称: com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1
状态: com.mchange.v2.async.ThreadPoolAsynchronousRunner@871664上的TIMED_WAITING
总阻止数: 31,330, 总等待数: 76,038

堆栈跟踪: 
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)

其中c3p0的配置也是参考oschina的设置的,用的是c3p0-0.9.1.2.jar:

# DataSource
jdbc.datasource=com.mchange.v2.c3p0.ComboPooledDataSource
jdbc.show_sql=true

# Database Configurations
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/sisdb?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=******
jdbc.maxPoolSize=100
jdbc.minPoolSize=2
jdbc.initialPoolSize=2
jdbc.acquireIncrement=2
jdbc.maxStatements=0
jdbc.maxIdleTime=300
jdbc.checkoutTimeout=5000

目前网站访问运行也很正常,请问老大,这种被blocked的情况一般是什么导致的?如果继续下去,网站会挂吗?如何避免这种情况的出现?如何stop阻塞的线程?谢谢!


展开
收起
kun坤 2020-06-20 11:01:20 940 0
1 条回答
写回答
取消 提交回答
  • @tsl0922 请教,麻烦看一下,谢谢!######有关闭连接吗? 连接应该在 finally 块中被确保释放
    ######好的,谢谢老大,我再查查!######回复 @FoxHu : OSC 是有的,因为我们过滤器针对所有请求######网站有个手机客户端通过线程HTTP请求访问网站数据,如/action/api/medicineList,过滤器在这种情况下执行完请求会关闭数据库链接吗?######@FoxHu 最后还是自己程序的问题居多######老大,我看你曾经也遇到过该问题, http://www.oschina.net/question/12_54864######

    如果你用 filter 关闭数据库连接,要注意一个问题:如果某个 action 处理请求耗时过长,这个 action 访问量大的话,就可能会导致大量数据库连接被占用,这种情况最好用完就关闭。

    ######检查代码时发现网站页面里有很多数据的展现读取都是通过velocity-toolbox.xml中定义的类读取数据的,而这些地方都没有关闭数据库连接,我在下面贴了示例代码######好的,我试试,多谢!###### @tsl0922 我在检测代码的时候发现,网站页面里有很多数据的展现读取都是通过velocity-toolbox.xml中定义的类读取数据的,而这些地方都没有关闭数据库连接,例如
    /** * 选取最近几条新闻 * @param count * @return */ public static List<New> topNews(int count){ String sql = "select * from cmsis_news where type=2 order by id  limit ?"; List<New> news = QueryHelper.query(New.class, sql,count); return news; }

    是不是这些地方导致的c3p0线程阻塞呢?对于这些tools类,每个方法我都要加上数据库连接关闭吗? 
    注:网站 其他的通过action请求的都在filter的finally里关闭了数据库连接

    ######回复 @tsl0922 : 好的,非常感谢!######回复 @FoxHu : 检查下有没有在 filter 管不到的地方用了连接没关闭的,比如自己开的线程里。还有就是你的 filter 里有没有用到数据库连接,看看需不需要关闭。######回复 @tsl0922 : 感谢!我再检查一下其他代码!######不需要吧,OSC 的也是这样,都没有关闭的
    2020-06-20 11:01:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
多线程 立即下载
低代码开发师(初级)实战教程 立即下载

相关实验场景

更多