如何创建SessionFactory对象

时间:2016-08-12 04:27:03

标签: java hibernate static

在我的项目中,我使用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?

2 个答案:

答案 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) {
    }
}