现有如下的项目。。
在多线程测试的时候,提示
【基础提供程序在 Open 上失败。】
CRUD那一层,通过该类的静态方法创建一个对象,执行对应的数据库操作方法
一个数据库操作还没有完成的时候,又创建了个对象,然后上一个还没有关闭数据库连接,于是报错了。
现在有一个解决方案,是在创建对象的那个静态方法里加一个lock,保证同一时刻只有一个操作。
但是这样的后果是,网站变得很慢,比如有一个“创建订单”的业务是做了多个查询修改的操作,那这里就得耗时好几秒的时间。。。多线程测试,那就卡成狗了。
还有是可以数据库加事务,但是不管怎样,现在都会导致多线程下的操作,很慢。
我问同事,他们说这个问题老大来解决,但是过了很久了也没提到这个问题。苦想了好几天,也想不出个道道来。
项目都做完了,在测试呢,现在连lock也没加。。
不知道各位大神有什么好的建议。教教小弟
在线程中使用数据库的话,如果是使用ORM或一些流行的JDBC框架的话,通常要注意是:线程结束之前,要手工关闭数据库连接。
通常来说,框架们没办法厉害到,能感知你线程结束的时间,所以无法帮你做自动关闭。。当然,连接池或许有超时强制关闭的功能,但是那不是正确的使用方法。
底层用的ORM,虽然可以自动关闭。但是并发操作的时候,是不是除了加锁,没有别的办法,保证数据库查询顺序执行了另外,尽量不要做跨多个线程的事务。。尽量将事情放在同一个地方做,问题要简单化而不要复杂化。。如果确实不可避免,要视情况,如果事务量大而复杂,可以用消息队列(所谓的中间件)好像明白了点。有部分业务部分确实很复杂,频繁的查库改库,同事让我这部分加了事务,但是主要就是进入这一块的时候,网站的等待时间就很长。而且之前设计项目结构的时候,修改的操作就是“先查询,再赋值修改”,平白多了几次查询,搞得更慢了。。。事务少用,不是到万不而己别用,通过最终一致性来解决你不怕事务超时么??事务的使用就是为了保证数据,不用事务的话,就只能在业务代码上下功夫了数据库的读写操作是自动加锁的,感觉是数据库内部锁的问题。理解好,利用好内部锁的机制也许会有帮助。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。