大家好,我是欧阳方超,公众号同名。
1 概览
为一个页面写了多个接口,结果前端在同时调用这些接口时报错了,数据库又不让改相关参数,只能从代码层面解决,很沮丧。
2 问题分析
加班加点写了15个接口,由于这些接口都是为一个页面写的,所以在与前端联调时,前端就在打开这个页面时一次性把这些接口都请求了,结果报错了,数据库使用的是PostgreSQL,报错如下:
Caused by: org.postgresql.util.PSQLException: ERROR: could not resize shared memory segment "/PostgreSQL.501294234" to 1048576 bytes: No space left on device
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2675) ~[postgresql-42.3.3.jar!/:42.3.3]
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2365) ~[postgresql-42.3.3.jar!/:42.3.3]
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:355) ~[postgresql-42.3.3.jar!/:42.3.3]
这个问题看着从数据库下手去修改相关参数,能够修复的可能性比较大,但是奈何数据库是统一管理的,不是我想改就能改的,甚至同事还跟我说即使你反馈了也不大可能给你修改这些参数。好吧,有时候事情就是这么难推进,那项目还得继续,怎么办呢,只能从代码角度下手了,既然这些接口单独测试的时候都能够正常调用,而在全部同时调用时报错,那就让前端一次性少调些吧,比如页面里面有5个模块,每个模块使用3个接口,那就让这些模块间调用接口时顺序执行,而模块内部的接口可以并发调用,这样改了之后还是有一个模块在调用接口时报错,经查看这个模块一次性调用了6个接口,后来又把这6个接口改为顺序调用,问题才得以解决。
3 总结
前端在打开页面时一次性请求这些接口,导致 PostgreSQL 数据库报错,提示无法调整共享内存段大小,原因是设备空间不足。由于数据库由统一管理,修改相关参数难以推进,只能从代码层面寻找解决方案。这种解决问题的方式感觉很别扭,但是在不让修改数据库的前提下,也找不到其他的方案。各位有好的思路话请不吝赐教,欢迎在评论区留言。