C3P0 的一些被阻塞的线程

FoxHu 发布于 2014/06/04 13:05
阅读 1K+
收藏 0

@红薯 你好,想跟你请教个问题:用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阻塞的线程?谢谢!


加载中
0
FoxHu
FoxHu
@tsl0922 请教,麻烦看一下,谢谢!
0
红薯
红薯
有关闭连接吗? 连接应该在 finally 块中被确保释放
FoxHu
FoxHu
好的,谢谢老大,我再查查!
红薯
红薯
回复 @FoxHu : OSC 是有的,因为我们过滤器针对所有请求
FoxHu
FoxHu
网站有个手机客户端通过线程HTTP请求访问网站数据,如/action/api/medicineList,过滤器在这种情况下执行完请求会关闭数据库链接吗?
红薯
红薯
@FoxHu 最后还是自己程序的问题居多
FoxHu
FoxHu
老大,我看你曾经也遇到过该问题, http://www.oschina.net/question/12_54864
下一页
0
tsl0922
tsl0922

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

FoxHu
FoxHu
检查代码时发现网站页面里有很多数据的展现读取都是通过velocity-toolbox.xml中定义的类读取数据的,而这些地方都没有关闭数据库连接,我在下面贴了示例代码
FoxHu
FoxHu
好的,我试试,多谢!
0
FoxHu
FoxHu
@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里关闭了数据库连接

FoxHu
FoxHu
回复 @tsl0922 : 好的,非常感谢!
tsl0922
tsl0922
回复 @FoxHu : 检查下有没有在 filter 管不到的地方用了连接没关闭的,比如自己开的线程里。还有就是你的 filter 里有没有用到数据库连接,看看需不需要关闭。
FoxHu
FoxHu
回复 @tsl0922 : 感谢!我再检查一下其他代码!
tsl0922
tsl0922
不需要吧,OSC 的也是这样,都没有关闭的
返回顶部
顶部