+
 新版

mybatis中selectList查询被阻塞

流越1026 发布于 2017/05/12 10:08
阅读 3K+
收藏 1

DAO : Dao是通过继承SqlSessionSupport,通过getSqlSession()来获取session对象, 然后调用selectList方法进行查询数据;
mysql : 开启了慢日志, 慢日志的时间为1秒;

现在我用300个线程来访问一个完整的功能, 这300个线程运行一段时间之后, 有一部分执行了几百次, 但是有一部分只执行一次;通过调试,最后发现在调用selectList方法的时候, 会被阻塞, 并且没有sql出现在慢日志中(可以排除sql的问题), 这个有人遇到过没有?

出问题的代码如下(有):

SqlSession session = getSqlSession();

List<Integer> idList = new ArrayList<Integer>();

idList.add(1);

//这一个函数有时候会执行几百秒的时间

List<Object> list = session.selectList("Dao.getList", idList);

 

并且如果业务复杂的话,基本不会出现这样的问题, 只有很简单的那种业务才会出现这种问题

加载中
0
北极心
北极心

你用的啥连接池?另外你开启了300个线程同时去查一个线程执行多少次呢?,你的mysql配置最大支持多少连接。。。。。。

流
流越1026
数据库的配置如下所示(使用dbcp连接,mysql的最大连接数是3000): <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>         <property name="url" value="jdbc:mysql://localhost:3306/test?zeroDateTimeBeha
0
kongjun
kongjun

阻塞了可能是在等待连接池

流
流越1026
确实有这个可能, cpu占有率很高, 但是也不会一直阻塞同一个线程吧。现在是别的线程可以跑几百次, 但是有的线程一直在执行那一行代码,所以就搞不清楚了
0
士别三日
士别三日

线程数量太多,连接数更多,cpu忙着切换线程去了,没时间执行任务了

士别三日
士别三日
线程数量设置成cpu数的2倍就差不多了。
0
Ambitor
Ambitor

朋友,jstack 一下不就知道了?连接池设置了多少个。

流
流越1026
已经定位到了那一行代码,但这个是属于mybatis中的方法
0
北极心
北极心

引用来自“北极心”的评论

你用的啥连接池?另外你开启了300个线程同时去查一个线程执行多少次呢?,你的mysql配置最大支持多少连接。。。。。。

上面的朋友的意见也都很好都可以去排查下,另外还有可优化的地方就是连接池换换,比如HikariCP 或者Druid都可以,用法和你的dbcp都差不多

流
流越1026
嗯嗯, 好的, 非常感谢, 我先试试看
北极心
北极心
HikariCP我是和dbcp c3p0 Druid一些连接池实测过,HikariCP性能和数速度都比dbcp c3p0 Druid要好,有时候虽然是只节约了0.几秒,但并发大的话还是挺有用的
0
风翔飞
风翔飞

除了连接池,看看这个sql是不是需要优化。。。

流
流越1026
就这一个sql语句
北极心
北极心
你用了in 有加索引么?
下一页
0
流
流越1026

mysql的最大连接数是3000,应用的最大活跃连接是1000

0
mlovewt
mlovewt
有过类似问题,就是同一SQLmybatis会卡住,用jdbc秒出,没看具体原因,就把卡住的换jdbc执行了
流
流越1026
这个你解决了没?
0
osc_85885119
osc_85885119

问题有jie jue ma

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部