在我的项目中,我使用Hibernate。要与数据库交互,我在服务器端使用以下类:
public class DatabaseWorker {
static SessionFactory sessionFactory = null;
static {
try{
sessionFactory = new Configuration().configure().buildSessionFactory();
}catch (Throwable ex) {
System.err.println("Failed to create sessionFactory object." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static void addToDatabase(String something) {
/...
}
}
当我第一次调用addToDatabase(String something)方法时,执行需要很长时间,因为需要创建sessionFactory。有没有办法在第一次查询之前创建sessionFactory?
答案 0 :(得分:0)
在应用程序启动期间初始化会话工厂将增加其他操作的延迟。关闭应用程序时关闭它。在应用程序的第一次请求期间不要放置会话工厂初始化部分。
答案 1 :(得分:0)
假设db查询不是你在应用程序中做的第一件事,你可以在后台的一个单独的线程中构建会话工厂。
不要在静态块中初始化该代码。为了同步,根据您的代码组织方式,您可以使用典型的单吨实现,也可以使用简单的未来对象,如下所示。
static FutureTask<SessionFactory> sessionCreatedFutureTask =
new FutureTask<SessionFactory>(new Callable<SessionFactory>() {
@Override
public SessionFactory call() throws Exception {
//initialize your SessionFactory
return sessionFactory;
}
});
public static void main(String[] args) {
new Thread("sessioncreator") {
public void run() {
sessionCreatedFutureTask.run();
}
}.start(); //Or put this to threadpool if u have any relevant common pool
...
...
}
public static void addToDatabase(..) {
try {
//get session factory and use it.
SessionFactory sessionFactory = sessionCreatedFutureTask.get();
} catch (InterruptedException | ExecutionException e) {
}
}