我研究了使用Java SDK存储日期和时间的DynamoDB选项。据我所知,Java8 LocalDate和LocalDateTime需要自定义转换器,而对于旧的Date,Calendar和Joda time LocalDateTime,有一些注释。
根据文档,@ DynamoDBTypeConvertedTimestamp支持标准的日期类型转换,例如java.util.Calendar,Long。 @DynamoDBTypeConvertedEpochDate可用于将Date,Calendar和org.joda.time.DateTime转换为数值。
同时,如果我没有在Date字段上添加任何注释,它就会像保存@DynamoDBTypeConvertedTimestamp一样保存,甚至范围查询也能成功运行。
是否有人知道解释不同的可能方法,并就从DynamoDB存储和检索Java日期和时间对象的最佳方法发表意见?
答案 0 :(得分:1)
TLDR;这取决于日期,时间等的使用方式。
这将取决于您的用例,因此没有一成不变的“最佳”方法。但是,要记住一些注意事项。
表架构中的值如何使用?
如果将Java 8日期/时间用作排序键,请考虑使用将其转换为字符串的自定义转换器。如果执行此操作,则可以在查询的关键条件表达式中使用begins_with
运算符,例如begins_with(myDate, "2018-12")
。如果您要搜索特定年,月,日,小时等中的所有内容,能够进行这样的查询将使您的代码更加简单。
如果您将该值用作DynamoDB TTL属性,则必须将其转换为数字时间戳。这是使用TTL功能的要求。
我们在谈论java.time
类中的哪一个?
Some of the classes in the java.time
package并不自然地转换为数字。例如,LocalDate
充其量只能转换为数字。将LocalDate 2018-12-10
转换为20181210
最为有意义,但是到那时,您必须编写足够的代码,以至于只能使用内置的LocalDate.toString()
和{ {1}}。
您必须多久查看一次数据库以查找错误或修复不良数据?
如果您经常在数据库中弄乱(希望不是这种情况),请使用人类可读的内容。在深夜传呼时,没人希望弄清楚LocalDate.parse()
是在2018-12-05T17:23:19.483+08:30
之前还是之后。
您的应用程序对增加的延迟有多敏感?
我还没有观察到与DynamoDB在将日期存储为字符串与数字有关的任何可测量的性能差异。但是,string parsing is slower that using a number将创建一个1544572463
对象,因此,如果将日期存储为字符串,则对您的应用程序可能会有轻微的影响。
不允许自定义转换器将您吓倒
使用java.time
API编写起来非常容易。这是为java.time
实现一个转换为LocalDateTime
的转换器的方法。
String
答案 1 :(得分:0)
尝试使用@DynamoDBTyped注释日期字段,这是一个覆盖dynamoDB中标准属性类型绑定的注释。因此它将转换为Attribute Type = S的日期,DynamoDM中为String。希望对您有帮助
@DynamoDBTyped(DynamoDBAttributeType.S)
private LocalDate startDate;