使用Scala,JodaTime和Squeryl进行ORM。有一个恼人的问题,一旦应用程序启动,使用JodaTime生成的时间戳不会在每次调用时重新初始化。相反,它会将时间设置一次,并且每次调用SQL时都不会重新初始化。
以下代码。首先,时间参数:
val todayEnd = new Timestamp(new DateMidnight(now, DateTimeZone.forID("America/Los_Angeles")).plusDays(1).getMillis())
Squeryl加入:
join(DB.jobs, DB.clients.leftOuter, DB.projects.leftOuter)((j,c,p) =>
where((j.teamId === teamId)
and (j.startTime < todayEnd)
and (j.userId isNotNull)
and (j.canceled === false)
and (j.completed === false))
select(j,c,p)
on(j.clientId === c.map(_.id), j.projectId === p.map(_.id)))
奇怪的是,如果我在没有 JodaTime的情况下生成todayEnd
时间戳,那么每次都会重新初始化。那么JodaTime的做法有何不同?
答案 0 :(得分:0)
发现问题:显然管理JOIN的线程从未成功关闭,并且正在Akka中重新引用。这意味着todayEnd
变量从未被重新初始化。
所以带回家的教训是:管理你的主题。
正如我进一步了解到的那样,保存时间值的原始对象被设置为val
。事实证明,他们需要def
。
为:
val today = new Date()
lazy val today = new Date()
好:
def today = new Date()