Я пытаюсь понять, возможно ли разделить спящий режим 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{
}
}