问题:Graalvm中的cassandra driver无法更新数据
原因:Graalvm中的项目,使用了native clock, native clock 使用了System.nanoTime()作为当前时间,写入canssandra数据时,writetime与当前时间相去甚远,是一个小于当前时间的值(1970年),cassandra根据writetime来判断保留时间最新的那个值,所以出现了重启服务、更换pod后,无法更新同一条数据的问题。
2023-07-18 17:06:29.614 INFO c.d.o.d.i.c.DefaultMavenCoordinates DataStax Java driver for Apache Cassandra(R) (com.datastax.oss:java-driver-core) version 4.15.0
2023-07-18 17:06:29.616 INFO c.d.o.d.i.c.o.Native Using Graal-specific native functions
2023-07-18 17:06:29.616 INFO c.d.o.d.i.c.t.Clock Using native clock for microsecond precision
解决方案:设置jvm参数强制使用java clock
-Ddatastax-java-driver.advanced.timestamp-generator.force-java-clock=true
查看数据writetime的cql,单位微秒:
select writetime(name),name from table where id='xx' ;
更新时指定writetime的cql,单位微秒:
update table USING TIMESTAMP 1690878297428000 set name='a' where id='xx' ;
ps:如果手动设置了一个非常超前的时间,数据将无法删除和更新