在应用程序启动期间将@NonBlocking与HIbernate ORM结合使用



在我的应用程序中,我需要在启动时初始化数据库中的内容。

以下文章:https://quarkus.io/blog/resteasy-reactive-smart-dispatch/提到以下内容。

"由于Hibernate ORM classic(我们也有Hibernate reactive(是阻塞的,如果不使用@blocking注释,就无法将其与RESTEasy reactive一起使用。此注释将调度策略更改为使用工作线程(而不是I/O线程(">

接着,通过查看名为的方法的签名,这些东西已经被简化了。如果签名意味着同步行为;工作线程";被选择。如果没有,则首选(更快(反应机制(i/o线程(。

它还提到了Hibernate reactive,而不是Hibernate classic。我还没有探索到那个领域。


但是,从这里开始,我想尝试做以下事情:

@Startup 
@ApplicationScoped
public class I18NBean{
public static Map<String, String> I18N = init();

private static Map<String,String> init(){
// initialize map from DB
}
public String translate(String in){
return I18N.get(in);
}
}

@Path("/hello")
public class GreetingResource {
@Inject
I18NBean translations;
@POST
@NonBlocking
public String hello( String in ) {
return translations.translate( in );
}
}

利用I/O线程作为资源,并在启动时进行hibernate(经典(交互。

简单的问题是:这行得通吗?未来几天我会自己尝试,但也许有一些基本的东西我忽略了,或者可能有更好的策略/设计,比如使用生命周期方法。

void onStart(@Observes StartupEvent ev) {               
LOGGER.info("The application is starting...");
} 

是的,这会起作用。这个想法是,您应该在工作线程上使用普通的Hibernate,而Hibernate Reactive应该在Vert.x事件循环线程上使用

最新更新