开发者社区> 问答> 正文

多线程并发时,数据库无法访问。数据库连接没有正确关闭??报错

现有如下的项目。。


在多线程测试的时候,提示

【基础提供程序在 Open 上失败。】

CRUD那一层,通过该类的静态方法创建一个对象,执行对应的数据库操作方法

一个数据库操作还没有完成的时候,又创建了个对象,然后上一个还没有关闭数据库连接,于是报错了。


现在有一个解决方案,是在创建对象的那个静态方法里加一个lock,保证同一时刻只有一个操作。

但是这样的后果是,网站变得很慢,比如有一个“创建订单”的业务是做了多个查询修改的操作,那这里就得耗时好几秒的时间。。。多线程测试,那就卡成狗了。

还有是可以数据库加事务,但是不管怎样,现在都会导致多线程下的操作,很慢。


我问同事,他们说这个问题老大来解决,但是过了很久了也没提到这个问题。苦想了好几天,也想不出个道道来。

项目都做完了,在测试呢,现在连lock也没加。。

不知道各位大神有什么好的建议。教教小弟


展开
收起
爱吃鱼的程序员 2020-06-14 14:48:25 1922 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    在线程中使用数据库的话,如果是使用ORM或一些流行的JDBC框架的话,通常要注意是:线程结束之前,要手工关闭数据库连接。

    通常来说,框架们没办法厉害到,能感知你线程结束的时间,所以无法帮你做自动关闭。。当然,连接池或许有超时强制关闭的功能,但是那不是正确的使用方法。

    底层用的ORM,虽然可以自动关闭。但是并发操作的时候,是不是除了加锁,没有别的办法,保证数据库查询顺序执行了另外,尽量不要做跨多个线程的事务。。尽量将事情放在同一个地方做,问题要简单化而不要复杂化。。如果确实不可避免,要视情况,如果事务量大而复杂,可以用消息队列(所谓的中间件)好像明白了点。有部分业务部分确实很复杂,频繁的查库改库,同事让我这部分加了事务,但是主要就是进入这一块的时候,网站的等待时间就很长。而且之前设计项目结构的时候,修改的操作就是“先查询,再赋值修改”,平白多了几次查询,搞得更慢了。。。事务少用,不是到万不而己别用,通过最终一致性来解决你不怕事务超时么??事务的使用就是为了保证数据,不用事务的话,就只能在业务代码上下功夫了数据库的读写操作是自动加锁的,感觉是数据库内部锁的问题。理解好,利用好内部锁的机制也许会有帮助。
    2020-06-14 14:48:40
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
DTCC 2022大会集锦《云原生一站式数据库技术与实践》 立即下载
阿里云瑶池数据库精要2022版 立即下载
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载