{"id":498,"date":"2016-10-31T21:24:07","date_gmt":"2016-10-31T20:24:07","guid":{"rendered":"http:\/\/h2916922.stratoserver.net:8084\/?p=498"},"modified":"2016-11-11T12:39:52","modified_gmt":"2016-11-11T11:39:52","slug":"jpa-remote-datetime","status":"publish","type":"post","link":"https:\/\/www.ivojonker.nl\/?p=498","title":{"rendered":"Working with the DataBase remote datetime (JPA)"},"content":{"rendered":"<p>A few days ago i decided to pick up work on a simple web-game\u00a0i once tried to created when i was 15 (see related: <a href=\"http:\/\/h2916922.stratoserver.net:8084\/?p=326\">Generating isometric tiles and slopes<\/a>). And while working on it i decided the architecture should be able support multiple workers performing on a single database. As a consequence i required all my worker&#8217;s to be able to all use the same datetime.<\/p>\n<p>Now as i&#8217;m not in control of the host machines to actually perform a time-sync, i figured i should best use the remote-database time as the single truth.<\/p>\n<p>I ended up writing the following utility class, i&#8217;m really curious on what you guys think of it.<\/p>\n<p>note: Unfortunately no generic JPA query, but one specific to mysql<\/p>\n<pre class=\"lang:java decode:true\">package nl.ivojonker.sm.model.util;\r\n\r\nimport java.sql.Timestamp;\r\nimport java.util.Date;\r\n\r\nimport javax.annotation.PostConstruct;\r\nimport javax.ejb.Singleton;\r\nimport javax.ejb.Startup;\r\nimport javax.persistence.EntityManager;\r\nimport javax.persistence.PersistenceContext;\r\n\r\n\/**\r\n * Utility class for obtaining the current datetime from the database server.\r\n * @author Ivo\r\n *\r\n *\/\r\n@Singleton\r\n@Startup\r\npublic class DBDate {\r\n\r\n\tprivate static long localCacheDate=System.currentTimeMillis();\r\n\tprivate static long remoteCacheDate=System.currentTimeMillis(); \r\n\r\n\t@PersistenceContext \r\n\tprivate EntityManager em;\r\n\r\n\t\/**\r\n\t * Returns the date-time from the server.\r\n\t * @return\r\n\t *\/\r\n\tpublic static Date getDate(){\r\n\t\treturn new Date(remoteCacheDate+(System.currentTimeMillis()-localCacheDate));\r\n\t}\r\n\r\n\t@PostConstruct\r\n\tprivate void init(){\r\n\t\tlong beforRequest=System.currentTimeMillis();\r\n\t\tTimestamp remoteDate = (Timestamp)(em.createNativeQuery(\"select CURRENT_TIMESTAMP\").getSingleResult());\r\n\t\tlong latency = System.currentTimeMillis() - beforRequest;\r\n\t\t\r\n\t\tlocalCacheDate=beforRequest;\r\n\t\tremoteCacheDate=remoteDate.getTime()-latency;\r\n\t\t\r\n\t\tSystem.out.println(String.format(\"Local date: %1$s, remote set to date: %2$s, taking into account an estimated latency of: %3$s ms \", new Date(localCacheDate),new Date(remoteCacheDate),latency));\r\n\t}\r\n}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A few days ago i decided to pick up work on a simple web-game\u00a0i once tried to created when i was 15 (see related: Generating isometric tiles and slopes). And [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-498","post","type-post","status-publish","format-standard","hentry","category-geen-categorie"],"_links":{"self":[{"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=\/wp\/v2\/posts\/498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=498"}],"version-history":[{"count":5,"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=\/wp\/v2\/posts\/498\/revisions"}],"predecessor-version":[{"id":503,"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=\/wp\/v2\/posts\/498\/revisions\/503"}],"wp:attachment":[{"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ivojonker.nl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}