在我的应用程序中,我需要在启动时从数据库初始化内容。
下面的文章:https://quarkus.io/blog/resteasy-reactive-smart-dispatch/提到了以下内容。
“由于Hibernate ORM经典(我们也有Hibernate反应性)是阻塞的,如果不使用@阻塞注释,就不能将它与RESTEasy reactive一起使用。这个注释改变了调度策略,使其使用工作线程(而不是I/O线程)。”
接着,通过查看被调用的方法的签名,简化了这些内容。如果签名意味着同步行为,则选择"worker线程“。如果没有,则首选(更快的)反应机制(i/o线程)。
它还提到Hibernate反应性,而不是Hibernate经典。我还没有探索过那个领域。
但是,从这里开始,我想尝试做以下工作:
@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...");
} 发布于 2021-12-26 16:20:17
是的,这会有用的。其思想是,您应该在工作线程上使用普通的Hibernate,而在Vert.x事件循环线程上应该使用Hibernate反应性。
https://stackoverflow.com/questions/70487417
复制相似问题