wx191163 2024-07-09 21:15 采纳率: 0%
浏览 6

jdbc postgresql 根据ID查询偶尔返回null?

jdbc编程,在写单元测试时pgsql遇到问题:
saveAll一组对象,返回一组ID,然后这些ID并行执行findById ,偶尔会返回null,但是返回null时,其实数据库中是有这个数据的。而mysql和sqlite都正常的,就pgsql不正常,以为是docker镜像的问题,然后从pgsql官网下载pgsql12装在win10试也是偶尔返回null。不知道为什么,只有在连接池配置为1,即只有一个连接的情况下,测试才正常。或者不用并行测试,就正常的list.stream.forEach 也是正常的。不知道为什么了

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-09 21:30
    关注

    引自免费微信小程序:皆我百晓生

    你遇到的问题可能是由于PostgreSQL的并发访问处理或是JDBC与PostgreSQL之间的并发查询机制出现问题。对此我有以下几点建议和推测:

    问题原因:

    1. 事务隔离级别:PostgreSQL有一个叫做事务隔离级别的概念,它决定了事务并发时的行为。在某些隔离级别下,如果多个事务同时访问同一资源,可能会出现不可预见的结果。比如,在读取数据时,如果其他事务正在修改数据,可能会影响到你的查询结果。你可以检查你的JDBC连接的事务隔离级别设置。
    2. 连接池配置:当连接池配置为多个连接时,可能存在资源竞争问题。特别是在高并发场景下,多个线程可能同时尝试查询同一资源,可能会产生不一致的结果。你可以考虑增加更多的日志或调试信息,来观察连接池在高并发情况下的表现。
    3. 网络延迟和并发限制:在一些网络环境下,特别是当服务器在高负载下运行时,PostgreSQL可能对并发查询有一定的限制。你可能需要检查你的网络环境和服务器性能。
    4. 数据库锁和并发控制:PostgreSQL使用锁来控制并发访问。在某些情况下,如果其他查询或事务持有锁,可能会导致你的查询被阻塞或返回不一致的结果。你可能需要检查是否有长时间运行的事务或其他可能持有锁的操作。

    解决方案和建议:

    1. 调整事务隔离级别:你可以尝试调整JDBC连接的事务隔离级别设置,看看是否能解决问题。例如,你可以尝试设置为READ COMMITTED或REPEATABLE READ等隔离级别。注意,更改事务隔离级别可能会影响数据一致性和并发性能,请谨慎操作。
    2. 检查并发控制:查看是否有长时间运行的事务或其他可能导致锁的操作,并在数据库层面上检查并优化这些操作。如果可能的话,可以通过修改应用逻辑来减少高并发的查询压力。
    3. 调整连接池配置:如果问题确实与连接池有关,你可能需要调整连接池的配置参数,例如最大连接数、超时时间等。你也可以尝试使用不同的连接池库或配置选项来查看是否有改善。
    4. 使用串行化查询:如果并行查询经常出现这个问题,你也可以尝试将并行查询改为串行化查询来观察是否有所改善。虽然这可能会降低性能,但可以帮助你识别是否是并发引起的问题。
    5. 检查JDBC驱动版本和PostgreSQL版本兼容性:确保你使用的JDBC驱动版本与PostgreSQL数据库版本兼容。不同版本间可能存在不兼容或不稳定的因素。更新到最新版本可能有助于解决问题。

    最后,我建议你详细记录每次出现问题的具体情况和上下文环境(如时间、并发量等),以便更好地分析和定位问题原因。希望这些建议能帮到你解决问题!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月9日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?