我可以在springboot(jpa)中创建实体一段时间吗

dnph8jn4  于 2021-06-10  发布在  Redis
关注(0)|答案(3)|浏览(447)

我需要做一些显而易见的简单工作。但是我不知道使用springbootjpa存储库或者使用一些内存存储(比如redis)是否相关。因此,我需要在存储中创建一些产品,这些产品在15-20分钟的时间间隔内是可行的,在此时间间隔内可以删除。我可以使用一些addproduct rest方法吗?在实体创建之后,该方法将引用另一个方法,在该方法中,我传递实体id以使用timertask、executor service或另一个@async次线程来计算此间隔(以分钟为单位)并在其之后删除产品?这样使用是否正确和可行?我是否应该使用spring redistemplate和expire()方法作为替代方法?在第一个选项的上下文中,像mysql这样的standart db是否适合用于一些短期对象,或者在内存中h2是更好的选择?

70gysomp

70gysomp1#

关于实体问题,实体只是Map到数据库行的简单pojo。jpa生命周期和机制不允许您在特定时间段内创建实体。mvc框架中的实体的生命周期与http请求的生命周期一样长,在某些不幸的情况下,直到您的视图(例如html)被呈现。
jpa不提供从持久性上下文中自动逐出条目的可能性。某些外部方(如计划任务)应在特定实体上执行逐出,这是一项繁琐的任务。
方案1:
您可以让一个实体保存一个时间戳,比如saved\u date,然后运行一个计划的作业,比如说每15分钟一次,来清理数据库。
方案2:
你也可以利用你的ttl机制。因此,假设有人请求一个15-20分钟前的资源(在rest端点上),您可以丢弃它。
方案3:
从我的观点来看,最好的方法是让数据库本身通过ttl处理过期数据。
据我所知,reddis和cassandra支持通过ttl自动过期数据,数据库本身将为删除过程标记候选行。

gk7wooem

gk7wooem2#

正如我所读到的,spring有内置的线程执行器,它允许调用异步方法,并返回调用方方法,而不是等待完成异步调用。在这里-让一个线程睡眠30分钟-我读到使用thread.sleep()显然与如此大的间隔不太相关,所以最好使用timer。所以我有这样的选择:@async

public void deleteAsync(long id) throws InterruptedException {
         new Timer().schedule(new TimerTask() {public void run() {
         try{
         deleteProduct(id); //synchronous service method
         }
         catch (Exception ex) {}
         }},900000);
         //Thread.sleep(900000); 
         //deleteProduct(id);
        }

实际上,我不知道在另一个辅助线程中使用timer runnable是否正常。所以还有另外一个选择——使用taskscheduler-

taskScheduler.schedule(
     new Runnabletask("Specific time, 15 minutes from now"),
     new Date(System.currentTimeMillis + 900000)
     );

但是我考虑了这样的问题——我应该把它放在@async方法中吗?对于许多时态产品,有足够的线程池吗

5rgfhyps

5rgfhyps3#

public ResponseEntity<?> addTemporalProduct(@RequestBody Product product) {
         Product newProduct=productRepository.createProduct(product);
         Long id=newProduct.getId();
         new Timer().schedule(new TimerTask() {public void run() {
             try{
             productRepository.deleteProduct(id);
             }
             catch (Exception ex) {}
             }},120000);
         return new ResponseEntity<>(HttpStatus.OK);

我希望这样做,但要在单独的线程中的单独方法中分离new timer(),其中它可以等待,但rest方法将在调用应该等待的回调后返回。我不能使用这样的选项,因为我刚才读定时器只使用一个线程。所以我需要删除或使有效删除后15分钟内创建,但产品可以在任何时间创建,所以没有共同的时间删除所有的在同一时间。可能会创建一些执行器线程,每隔一两秒钟侦听inmemory列表[id,expirationinterval],然后删除是否有过期的。我将这种实现用于sse事件。我还看到了这个超时示例—如何在SpringBootRESTAPI上设置超时?在callable中(为什么不在runnable中)-但是我需要等待十几分钟,而不是几秒钟。

相关问题