zamkniecie fabryki EntityManagerFactory??

0

Wymyśliłem sobie, że bedę tworzył fabryke w czasie właczenia aplikacji, a inicjalizował za każdym żądaniem użytkownika.
Czy takie rozwiązanie, jest bezpieczne dla poniższego serwletu, w przypadku gdy bedzie w jednym czasie kilkanaście żądań??

DBConfig:

package forum.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class DBConfig implements ServletContextListener {
	private static EntityManagerFactory emf;
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		if( emf != null && emf.isOpen()) emf.close();

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		emf = Persistence.createEntityManagerFactory("Forum");
	}
	
	public EntityManagerFactory getEntityManagerFactory() {
		return emf;
	}
}

InicjatorDB

package forum.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;

import forum.dao.TematyDAO;
import forum.dao.UzytkownicyDAO;
import forum.dao.WpisyDAO;
import forum.encje.Temat;


@WebListener
public class InicjatorDB implements ServletRequestListener {

    /**
     * Default constructor. 
     */
    public InicjatorDB() {
        // TODO Auto-generated constructor stub
    }

	/**
     * @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
     */
    public void requestDestroyed(ServletRequestEvent arg0) {
        // TODO Auto-generated method stub
    }

	/**
     * @see ServletRequestListener#requestInitialized(ServletRequestEvent)
     */
    public void requestInitialized(ServletRequestEvent arg0) {
    	DBConfig emfConfig = new DBConfig();
    	EntityManager em = emfConfig.getEntityManagerFactory().createEntityManager();
    	UzytkownicyDAO uzytkownicyDAO = new UzytkownicyDAO(em);
    	WpisyDAO wpisyDAO = new WpisyDAO(em);
    	TematyDAO tematyDAO = new TematyDAO(em);
    	ServletRequest req = arg0.getServletRequest();
    	req.setAttribute("tematyDAO", tematyDAO);
    	req.setAttribute("wpisyDAO", wpisyDAO);
    	req.setAttribute("uzytkownicyDAO", uzytkownicyDAO);
    }
	
}

example Servlet:

 
package forum.servlety;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import forum.dao.TematyDAO;
import forum.encje.Temat;


@WebServlet("/index")
public class IndexServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		TematyDAO dao = (TematyDAO) request.getAttribute("tematyDAO");
		List<Temat> listaTematow = dao.pobierzTematy();
		request.setAttribute("tematy", listaTematow);
		request.getRequestDispatcher("tematy.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
0

Wszytko co dzieje się wewnątrz metod jest thread safe (stack confinement) - ale to dzikie jakieś jest.

Już logiczniej było by zarządzać tym managerem w servlecie - bo to co robisz jest IMO bez sensu.

Także, wygląda na bezpieczne, bo tworzysz entity manager z factory który przez ten stack confinement jest przywiązany per wątek.

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