4
回答
多线程并发时,数据库无法访问。数据库连接没有正确关闭?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

现有如下的项目。。


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

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

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

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


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

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

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


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

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

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


<无标签>
举报
visten
发帖于2年前 4回/1K+阅
共有4个答案 最后回答: 2年前

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

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

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