记录一次postgresql临时表丢失问题

项目相关技术栈

springboot

hikari连接池+pgbouncer+postgresql数据库

背景

为了优化一个任务执行的速度,我将任务的sql中部分语句抽出生成临时表(create temp table tempqw as xxxxxxxxx),再和其他表关联,提高查询速度。测试,没有问题,上线观察日志却发现偶发如下报错,报错信息如下:

relation "tempqw" does not exist

推测

临时表消失,只能有两种原因:

1. 被删除了(可能是数据库某些机制或者我的程序中删除的)

2. 创建临时表和使用临时表不在同一个数据库会话中

检查

首先检索springboot程序代码的日志,发现在使用前并没有drop临时表,排除程序删除临时表。

postgresql中的临时表分为会话级和事务级,在会话级临时表中,数据可以存在于整个会话的生命周期中,在事务级临时表中的数据只能存在于事务的生命周期中。

我在此处创建的是会话级别的临时表,是不能跨会话的。所以检查创建临时表和使用临时表的sql语句,是否为一个java线程,结果也是同一个线程,讲道理是一个会话啊,至此有点懵逼。

于是找了postgersql的日志:

根据数据库日志,发现虽然程序是同一个java线程,但是sql执行过程中突然换了一个数据库会话,由于pg临时表是会话隔离的,所以就自然而然的报错了。

总结

使用了线程池,不能保证同一个java线程中的每次查询使用相同的数据库会话。(如果使用事务应该没有这个问题)

相关推荐

  1. go 问题记录(日志丢失

    2023-12-15 10:58:02       38 阅读
  2. Postgresql float8类型精度丢失问题

    2023-12-15 10:58:02       13 阅读
  3. 记录业务遇到的sql问题

    2023-12-15 10:58:02       16 阅读
  4. postgresql 锁定问题处理

    2023-12-15 10:58:02       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-15 10:58:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-15 10:58:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-15 10:58:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-15 10:58:02       20 阅读

热门阅读

  1. 英语六级作文好句

    2023-12-15 10:58:02       33 阅读
  2. 【antd】 Pagination.onChange获取不到pageSize值的原因

    2023-12-15 10:58:02       40 阅读
  3. Windows下ping IP+端口的方法

    2023-12-15 10:58:02       51 阅读
  4. 飞天使-docker知识点6-容器dockerfile各项名词解释

    2023-12-15 10:58:02       33 阅读
  5. 力扣labuladong——一刷day74

    2023-12-15 10:58:02       38 阅读
  6. filecmp --- 文件及目录的比较

    2023-12-15 10:58:02       37 阅读
  7. mysql binlog_ignore_db参数的效果详解

    2023-12-15 10:58:02       36 阅读
  8. 9月7日算法学习笔记(栈)

    2023-12-15 10:58:02       34 阅读
  9. 力扣面试150题 |有效的括号

    2023-12-15 10:58:02       49 阅读
  10. LintCode 123 · Word Search (DFS字符处理经典题!)

    2023-12-15 10:58:02       38 阅读