10个sql,dbcp连接池,分给10个线程去执行,为什么效率没有提高呢?
要查10个SQL语句,每句执行的时候都略长,于是决定开多线程来执行。
在navicat premium软件中10个语句开两个查询窗口执行,每个执行5个,时间明显缩短,
为什么在程序中,开多线程执行,时间没有节省呢?
10个线程中,检查过connection的hashCode是不同的,
难道这10个connection在排队呢?
求指点
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(21)
谢谢你哈,但用navicat软件开多窗口执行的时候,确实快了,所以我才想办法多线程尝试,感觉navicat快,是不是多开了线程呢?
我想知道如何@所有人呢,更正一下
开多线程之后,确实速度有提升,
只是,一个是7秒到4秒,一个是3秒到1秒,这种级别,
你应该用sql直接把数据处理好,分页查询后反给前台。
换连接池试试?我记得dbcp是单线程
这个和连接池没有关系了,相当于你之前是数据库 1个sql并发,现在是10个并发,按你的描述,这些sql耗时较长,那占用资源也很可能较大,你超10个线程,相当于 10个 占用较大资源 的sql并发,数据库压力这时会增大,原来1个sql执行要5s,那么在10个并发的请求,这个sql可能执行要 50s。相对于开线程前后,数据库的资源一定,并发情况下,起到负优化也是正常的。
如果说10个全都是全表,那么除了数据库倒霉消耗增加10倍,没有一毛钱节约。分批返回,还要加上额外的通讯握手交互成本。
先尝试优化SQL吧,搞清楚执行时间长的具体原因再说。特别是如果大量全表,怎么也降不下来的。
那求教一下,比如10条语句,在navicat,一个查询窗口,会花10秒,如果两个窗口,每个执行5个语句,每个窗口都花5秒,而两个窗口同时执行,所以就节省了时间。 那在我们开发环境中,如何实现类似的效果呢? 求教~
唉,被鄙视了~ 10个都是查询语句,要获取每个语句的结果,然后汇总到一起,处理一下返回给前台。 我去试试怎么用jdbc多线程处理, 但还是没懂,为什么我的思维错了呢, 本来想的挺好的,为什么不会并发执行呢?求解~~
恐怕你是不了解多线程吧,10个线程 你真的以为是并发么?你用多线程来解决SQL的问题 让我感觉有点搞笑..你应该从你的sql入手,JDBC 也有批量处理sql的API
回复
让汇总到一起这种动作也用sql让数据库去做,不要自己拿出数据用代码做
回复
@蓝水晶飞机 : 确实用的链接池,dbcp, 也正在用jdbc测试, 初步看,jdbc好像没有变快, 一会儿再换大数据量试试,感谢 : )
不了解你的具体场景,单单是说开多少个connection去执行并不能说明性能,万一你用连接池的呢!适当的并发可以提高效率,过大的并发反而造成堵塞。
引用来自“蓝水晶飞机”的评论
10 个 connection,需要开启10个TCP连接,还需要经过登陆验证授权。
2 个 connection,批量执行5-5,又是因为是批量,所以更快。
111
回复
@零壹贰弎肆伍陆柒捌玖 : ???
?
因为此次用户请求的效率瓶颈在这些sql查询的时间上, 我的想法是,多开几个线程去执行, 因为看软件里,开两个查询窗口,时间就缩短了一半, 按您的意思来说,我这种让10个 connection 去同时执行,不能解决当前的问题的是吧? 那您那边,有没有什么好的建议呢?
10 个 connection,需要开启10个TCP连接,还需要经过登陆验证授权。
2 个 connection,批量执行5-5,又是因为是批量,所以更快。
在创建连接池的时候,设置初始连接数,按照你说的,你检查了10个连接的hashcode都不相同,那么初始化连接应该没有问题,假如你一条sql需要5秒,你开始的时候直接查询10个sql,是串行的,所以需要50秒的时间这个没有问题,按照理论那么10个线程每个执行一条sql并发执行,不说5秒之内执行完毕,最起码应该低于50秒,但是由于你的sql性能过低,并发请求导致数据库压力变大或者操作同样的数据导致行锁,甚至可能会出现死锁。
锁表等待,不清楚呢,有没有想法在哪里测试这个问题呢? 所有的sql都是查询,会不会有锁表问题?
10条sql是互不干扰的吗? 存不存在锁表等待的可能性?