aplikacja webowa wraz z bazą

0

Witam,
uczę się jsp i serwletów i staram się prawidłowo do tego korzystać z bazy.

Czy rozsądne jest, aby w każdym serwlecie tworzyć połączenie do bazy danych. Następnie dla przykładu w doGet i doPost mam dostępny połączenie na podstawie którego mogę wykonywać zapytania, z kolei połączenie zamykać też w każdym serwlecie w metodzie destroy()
Czy nie narażę się tu przy większym ruchu na zabicie bazy ? Czy są jakieś lepsze praktyki ? Szukam po sieci, ale w większości każdego tutka wszystko jest tworzone w metodach doXXX i przeważnie jest to pokazywane tylko po to, żeby pokazać, że można, a nie po to by pokazać czy to sensowne.

Pozdrawiam

0

Klasa statyczna twrząca instalcje połączenia z bazą danych oraz udostępniająca to połączenie dla każdego z servletów.

0

ok czyli tworze klasę statyczną i wywołuję ją w klasie init ? tam sobie zwracam obiekt Connection ?

czy na etapie doXXX ?

będę też wdzięczny za przybliżenie pojęcia klasy statycznej. Chodzi o wewnętrzna klasę w klasie servlet ustawioną jako static ? Czy to jakieś uogólnienie z twojej strony ?

0

Jest problem. Kod poniżej

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

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 org.dawid.models.PageModel;
import org.dawid.pojo.Page;

/**
 * Servlet implementation class System
 */
@WebServlet("/System")
public class System extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public System() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Connection connection = Connector.getConnection();
		String select = "SELECT * FROM pages WHERE uid = ?";
		try {
			PreparedStatement selectQuery = connection.prepareStatement(select);
			selectQuery.setInt(1, 1);
			ResultSet result = selectQuery.executeQuery();
			result.first();
		} catch(SQLException sqlex) {}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}
	
	private static class Connector {
		public static Connection getConnection() {
			Connection connect = null;
			try {
				Class.forName("com.mysql.jdbc.Driver");
				connect = DriverManager.getConnection("jdbc:mysql://localhost/welcomeweb?user=user&password=pass");
			} catch(ClassNotFoundException cnfe) {
				//	System.out.println("brak klasy");
			} catch(SQLException sqle) {
				//	System.out.println("brak polaczenia");
			}
			
			return connect;
		}
	}
} 

PreparedStatement selectQuery = connection.prepareStatement(select); <-- na tej linii dostaje NullPointException. Wygląda jakby połączenie było nullem a nie jest. Nie rozumiem czemu tak się dzieje :/

0
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session Factory object.
 *
 * @author kuba
 */
public class NewHibernateUtil {

    private static final SessionFactory sessionFactory;
    
    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

 

Powinno rozwiać Twoje wątpliwości ;)

0

przy założeniu, że używam Hibernate to może i owszem

Jednak chciałbym wiedzieć dlaczego mój uber trywialny, banalny sample nie działa. Lubie znać podstawy zanim zacznę opakowań używać

0

Napisz klasę Connector tak:

        private static class Connector {
                public static Connection getConnection() {
                        Connection connect = null;
                        try {
                                Class.forName("com.mysql.jdbc.Driver");
                                connect = DriverManager.getConnection("jdbc:mysql://localhost/welcomeweb?user=user&password=pass");
                        } catch(ClassNotFoundException cnfe) {
                                System.out.println(cnfe);
                        } catch(SQLException sqle) {
                                System.out.println(sqle);
                        }
 
                        return connect;
                }
        }

dowiesz się co poszło nie tak.

0

W servlecie tak nie mogę bo zwraca mi błąd o braku metody out

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