- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个旧的网络应用程序,相关的当前堆栈是:Java 8、Tomcat 7、Apache Commons DBCP 2.1、Spring 2.5(用于事务)、iBatis、PostgreSQL 9.2 和 postgresql-9.4.1208.jar
部分代码在incidents
表中插入新记录,其中字段begin_date
(timestamp(3) with time zone
)是一个创建时间戳,用now
填充:
insert into incidents
(...., begin_date, )
values
(..., 'now' ....)
所有这些都是通过 iBatis 执行的,事务通过 Spring 以编程方式管理,连接通过 DBCP 池获取。 Web 应用程序(实际上是一对,客户端和后台,共享大部分代码和 jars)多年来一直在工作。
最近,也许在一些库更新和重组之后(似乎没什么重要的),我一直在经历(间歇性的,难以重现)一些讨厌的问题:现在
似乎卡住了,它开始返回相同的“旧”值。然后,许多记录出现在几个小时或几天前,具有相同的创建时间戳:
db=# select 'now'::timestamptz;
timestamp
-------------------------
2016-06-10 21:59:03.637+00
db=# select rid,begin_date from incidents order by rid desc limit 6;
rid | begin_date
-------+----------------------------
85059 | 2016-06-08 00:11:06.503+00
85058 | 2016-06-08 00:11:06.503+00
85057 | 2016-06-08 00:11:06.503+00
85056 | 2016-06-08 00:11:06.503+00
85055 | 2016-06-08 00:11:06.503+00
85054 | 2016-06-08 00:11:06.503+00
(以上所有记录实际上都是在2016-06-10 21:50
前几分钟创建的)
这怎么会发生?这可能是与事务和/或连接池相关的一些问题,但我不知道是什么。我知道'now() '是transaction_timestamp()
的别名,返回交易开始的时间。这表明事务未正确关闭,并且上面的记录插入(无意中)写入了单个长事务。但这对我来说看起来相当不可思议。
首先,我可以插入一条新记录(通过 webapp),然后使用 psql
控制台,我看到它是用相同的 begin_date
编写的(如果事务未提交,我不应该看到新记录,我有默认的序列化级别)。
此外,pg_stat_activity
View 仅显示idle
连接。
有什么线索吗?
最佳答案
有常量(特殊时间戳值)'now'
。
还有函数 now()
。
您随意混合它们的事实表明您没有意识到最重要的区别。 The manual:
Special Values
PostgreSQL supports several special date/time input values for convenience, as shown in Table 8-13. The values
infinity
and-infinity
are specially represented inside the system and will be displayed unchanged; but the others are simply notational shorthands that will be converted to ordinary date/time values when read. (In particular,now
and related strings are converted to a specific time value as soon as they are read.) All of these values need to be enclosed in single quotes when used as constants in SQL commands.
大胆强调我的。
而且(就像你自己提到的那样),但引用了 the manual :
now()
is a traditional PostgreSQL equivalent totransaction_timestamp()
.
和:
transaction_timestamp()
is equivalent toCURRENT_TIMESTAMP
还有更多,通读整章。
现在(没有双关语意),因为您使用的是特殊值而不是函数,您会通过准备好的语句获得不同的(出乎您意料的)行为。
考虑这个演示:
test=# BEGIN;
BEGIN
test=# PREPARE foo AS
test-# SELECT timestamptz 'now' AS now_constant, now() AS now_function;
PREPARE
test=# EXECUTE foo;
now_constant | now_function
-------------------------------+-------------------------------
<b>2016-06-11 03:09:05.622783+02 | 2016-06-11 03:09:05.622783+02</b> -- identical
(1 row)
test=# commit;
COMMIT
test=# EXECUTE foo;
now_constant | now_function
-------------------------------+------------------------------
<b>2016-06-11 03:09:05.622783+02 | 2016-06-11 03:10:00.92488+02</b> -- different!
(1 row)
虽然您在同一个事务 中运行两者,但'now'
和now()
产生相同的结果值(value)。但是准备好的语句旨在持续整个 session (可能跨越许多事务)。下次执行准备好的语句时,您会看到不同之处。
换句话说:'now'
实现了“早期绑定(bind)”,而 now()
实现了 < strong>“后期绑定(bind)”。
您可能已经引入了准备好的语句和/或连接池(它可以将准备好的语句保留更长的时间)——这两个想法通常都是不错的。但是 INSERT
中隐藏的问题现在开始出现了。
您看到的“空闲连接”表明:连接保持打开状态,保留准备好的语句。
简而言之:使用 now()
。
或者,将 begin_date
的列默认设置为 now()
(不是
!) 并且不要在 'now'
INSERT
中提及该列。您的“创建时间戳”会自动保存。
关于postgresql - PostgreSQL : 'now' keeps returning same old value 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37758022/
old = [1, 2, 3] 下面两行有什么区别(如果有的话)? new = old[:] new = list(old) 更新 我已经接受了 ubershmekel 的回答,但后来我了解到一个有趣
我在不同的 table 上发现了两个类似的触发器。 create or replace TRIGGER "GM_OWNER".CHG_TYPE_TRG AFTER INSERT OR UPDATE O
我知道 CSS 中有 3 个版本的 FlexBox。旧版、Tweener 和新版:根据:http://css-tricks.com/old-flexbox-and-new-flexbox/ 我的问题:
我正在尝试编写一个小程序来替换从 Excel 文件中读取的单词。旧词和新词的格式相同,some_thing_else 或 Some_Thing_else。考虑下面的 2 个单词及其替换: someth
我们逐渐从一个旧的网络应用程序转移到一个新的。 到目前为止,两者都已部署:/old 和 /new。 现在,新的已完全发挥作用,我们想彻底删除旧的。问题是用户可能已将书签保存到旧的 webapp。 /o
在 ON CONFLICT DO UPDATE 中有一个“旧值”的别名? 我的现实生活问题是 INSERT INTO art.validterm (namespace,term,X,info)
当我使用Jasper作为接口(interface)时,有时接口(interface)会调用jasper并生成报告,然后我们会得到如下异常: ==============================
我的 data.fs 是 500 MB,所以我打包然后备份它,结果是 100 MB。 我的主机账户只有 500 MB,所以我想知道删除 data.fs.old (500 MB) 是否安全? 最佳答案
我参与了几个项目,这些项目主要涉及用"new"系统替换“旧”系统。始终存在这样一种模式,即在构建"new"系统的团队中几乎没有人真正了解“旧”系统。每当我对此提出疑问时,都会被告知这是有目的的……通过
当我取消选中一个复选框并且验证失败时,我希望该复选框保持未选中状态,而是被选中。 我的复选框: member == 1) ? 'checked' : '' }} {{ (old('member')
谁能帮助我了解何时在PLSQL块中使用:NEW和:OLD,但我发现很难理解它们的用法。 最佳答案 通常,您在trigger中使用这些术语,其中:old引用旧值,:new引用新值。 这是上面链接的Ora
我有一个 ES6 应用程序(带有 Babel 6.5 和 Webpack),它成功导入了我的模块,如下所示: import $ from 'jquery'; 我想安装https://github.co
下面的 C89 是合法的吗? void f(a) char a[sizeof &f]; { } 我的想法是肯定的,因为在任何 block 范围之外声明的标识符的范围在声明符结束后立即开始并延伸到翻译单
我正在使用一个提供 REST API 的应用程序。它仅适用于 GET 请求,通常最多花费 100 毫秒来处理最繁重的请求。 最近我们开始面临一个问题,即堆有时会被填满,而完整的 GC 会花费大量时间,
我们服务器的 JVM 标志(内存)如下所示 -Xms2048m -Xmx2048m -Xss512k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMS
我正在使用 mysql 构建一些触发器。其中之一是检查插入的值是否存在于数据库中。 当触发器比较日期值时。它将返回 0 行。我尝试在 new.column 名称周围附加引号,但它的字面意思是“new.
我已经创建了这个触发器: CREATE TRIGGER trig_update AFTER INSERT ON "delivery" FOR EACH ROW EXECUTE PROCEDURE pr
当我尝试执行此脚本时,出现错误:错误:关系“旧”不存在。脚本: update organization set row_status = 30; 我发现了一些这样的问题,但他们没有帮助我。我的触发器:
在 PostgreSQL 中,我有这个表...(最左侧的“timestamp02”中有一个主键,此图中未显示,请不要打扰,它对于这个问题的目的并不重要) 在上表中,所有列都是通过查询输入的,除了“ti
在 PostgreSQL 中,我有这个表...(在最左侧的“stmtserial”中有一个主键序列列,此图中未显示) 在上表中,所有列都是通过查询输入的,除了“time_index”是通过 BEFOR
我是一名优秀的程序员,十分优秀!