Как разделить Hibernate Session между несколькими потоками - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь понять, возможно ли разделить спящий режим session среди threads и пытаюсь закодировать что-то вроде ниже:

Идея как ниже.Взгляните на метод execute в приведенном ниже коде.

  • Откройте session и запустите transaction
  • Запуск отдельных потоков.Потоки используют session для любых операций с базой данных.Однако они могут получить новый сеанс из sessionFactory и использовать его для любых конкретных операций.
  • Вызовите commit для принятия всех изменений или, если возникнут ошибки, будет выполнен откат.

Но я не уверен, есть ли другие методы (API) Session, которые могут потенциально привести к проблемам?

    public class MyDaoHibernateImpl  {

    /**
     * returns session
     * @return
     */

    protected Session getSession(){
        return HibernateUtil.getSessionFactory().openSession();
    }

    private SessionFactory getSessionFactory(){
        return HibernateUtil.getSessionFactory();
    }

    private volatile Session session;
    //This is not required to share across the threads
    private volatile Transaction tx;


    /**
     * starting session and transaction
     */
    public void openSession(){
        session = getSession();
        tx = session.beginTransaction();
    }

    /**
     * commits unit of work
     */
    public void commitSession(){
        tx.commit();
        session.flush();
        session.close();
    }

    /**
     * Rollback unit of work
     */
    public void rollbackSession(){
        tx.rollback();
        session.flush();
        session.close();
    }

    /**
     * This method is just a template, it starts session and commits the session or rollback if any failure.
     */
    public void execute(){
        try{
            openSession();
            performOperationInsideAThread1();
            performOperationInsideAThread2();
            commitSession();

        }catch (Exception e){
            rollbackSession();
        }
    }

    /**
     * DO NOT COMMIT OR CLOSE THE SESSION HERE, However you are free to open new session and perform transactions.
     * using getSessionFactory{@link #openSession()}
     * @throws RuntimeException
     */
    private void performOperationInsideAThread1() throws RuntimeException{


    }

    /**
     * DO NOT COMMIT OR CLOSE THE SESSION HERE, However you are free to open new session and perform transactions.
     * using getSessionFactory{@link #openSession()}
     * @throws RuntimeException
     */
    private void performOperationInsideAThread2()  throws RuntimeException{

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...