Hibernate wiele sesji

0

Powiedzcie mi czy ten kod obrazuje wiele sesji? I jeśli tak to czy JDBC w podobnym zastosowaniu wysypał by mi wyjątek?
Chodzi mi o pokazanie różnicy między hibernate który może tworzyć wiele sesji dla jednego klienta(w tym przypadku wiele sesji w obrębie jednej aplikacji) a JDBC który nie obsługuje wielu sesji naraz. Oto kod:

Fabryka sesji:

 import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.EntityMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class HibernateConfig {
	private static final SessionFactory sessionFactory;
	
	static {
		try{
			sessionFactory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();
		}
		
		catch(Throwable ex){
			System.err.println("problem z tworzeniem fabryki: "+ ex);
			throw new ExceptionInInitializerError(ex);
		}
	}
	public static SessionFactory getSessionFactory(){
		return sessionFactory;
	}
}

Główne okno aplikacji:

 public class HibernateMain {
    //konstruktor a w nim tworzenie okienka nadanie mu właściwości itd
    HibernateMain(){
   
   //ciało konstruktora
	    //Przycisk ModButton który tworzy nowy obiekt klasy ModData(); (o to się rozchodzi czy to jest ten moment tworzenia wielu sesji)
	    ModButton.addActionListener(new ActionListener(){
	    	public void actionPerformed(ActionEvent e){
	    		ModData md = new ModData();
	    	}
	    });
   }
   //main
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

                @Override
                public void run() {
                	HibernateMain okno = new HibernateMain();
                	
                }

}

Zawartość ModData:

public class ModData {

   //dodaje komponenty

     ModData(){
    
     //konstruktor moddata() nadaje właściwości dla okienka i wywołuje je
     //+przycisk który wywołuje funkcje poniżej 
			find.addActionListener(new ActionListener(){
					public void actionPerformed(ActionEvent event){
					findbutton(Jakies_parametry);
					}
			});
 
    }
	public void findbutton(Funkcja_przyjmuje_jakies_parametry_do_Criteria) {

		Session session = HibernateConfig.getSessionFactory().getCurrentSession();
		session.beginTransaction();	

                //tu dodawanie danych z bazy za pomocą kryteriów do JTable co nie jest tu takie istotne

		session.getTransaction().commit();

	} 

I tu pytanie. Gdy z głównego okna wywołam np 5 razy ModData to utworzy mi 5 okienek a w jednym z nich podam jakieś dane ładuje się FabrykaSesji to oczywiście chwile trwa wynajduje mi te dane o które proszę i wyświetla w tabeli, super!
Gdy teraz otworzę 6'te okno albo skorzystam z 4 pozostałych które już utworzyłem i podam jakieś dane ono również mi je wyszuka i zapisze w tabeli już tym razem bez tworzenia fabryki sesji. Czy gdybym zrobił analogicznie ten przyklad ale zamiast :
Session session = HibernateConfig.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.getTransaction().commit();
Stworzył funkcje która łączy się bezpośrednio z baza przez JDBC i otworzył kilka okienek wysypał by mi wyjątek?
TAK/NIE dlaczego i czy mój tok rozumowania jest poprawny?
Z góry dzięki za odpowiedz!

0

getCurrentSession pobiera aktualną sesję więc nie działasz na wielu sesjach.

http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/SessionFactory.html

openSession() Tworzy nową sesję.

0

Dobrze prawisz wczoraj doczytałem trochę o tym ale, czegoś tu nie rozumiem.
Mianowicie po zmainie na openSession();
Czas przeszukiwania danych jest taki sam tzn 1 odwołanie w 1 oknie do funkcji trwa dłużej ale jak w innym oknie wywołam tą funkcję to trwa to chwile. Czy mogę po tym wnioskować że to nie sam moment openSession() odpowiada za to spowolnienie tylko sessionFactory?

0

Wywołanie openSession nie powinies odczuc bo jest to "lekka" operacja. Zreszta musi byc taka bo przeciez serwer w danym momencie moze otwierac setki sesji.
Natomiast tworzenie obiektu sessionFactory jest wolne, ale tak naprawdę tworzymy ten obiekt tylko raz (zakladajac ze masz jedna baze danych) w czasie wstawania serwera.

0 użytkowników online, w tym zalogowanych: 0, gości: 0