Oggetti statici e concorrenza in un'applicazione Web

1

Sto sviluppando piccole applicazioni Web Java sul server Tomcat e sto usando MySQL come database.

Fino ad ora stavo usando una connessione singleton per accedere al database, ma ho scoperto che questo garantirà solo la connessione per applicazione e ci saranno problemi se più utenti vogliono accedere al database nello stesso tempo. (Tutti devono farci di quel singolo oggetto Connection). Ho creato un Connection Pool e spero che questo sia il modo corretto di fare le cose.

Inoltre sembra che abbia sviluppato la cattiva abitudine di creare molti oggetti statici e metodi statici (principalmente perché avevo l'impressione sbagliata che ogni oggetto statico sarebbe stato duplicato per ogni client che accede alla mia applicazione).

Per questo motivo tutte le classi di servizi (classi utilizzate per gestire i dati del database) sono statiche e distribuite attraverso un ServiceFactory :

public class ServiceFactory {

private static final String JDBC = "JDBC";
private static String impl;

private static AccountService accountService;
private static BoardService boardService;

public static AccountService getAccountService(){
    initConfig();

    if (accountService == null){
        if (impl.equalsIgnoreCase(JDBC)){
            accountService = new JDBCAccountService();
        }
    }

    return accountService;
}

public static BoardService getBoardService(){
     initConfig();

    if (boardService == null){
        if (impl.equalsIgnoreCase(JDBC)){
            boardService = new JDBCBoardService();
        }
    }

    return boardService;
}
private static void initConfig(){
    if (StringUtil.isEmpty(impl)){
        impl = ConfigUtil.getProperty("service.implementation");

        // If the config failed initialize with standard
        if (StringUtil.isEmpty(impl)){
            impl = JDBC;
        }
    }
}

Questa era la classe di fabbrica che, come puoi vedere, consente l'esistenza di un solo Servizio in qualsiasi momento. Ora, questa è una cattiva pratica? Cosa succede se diciamo che 1k utente accede a AccountService contemporaneamente?

So che tutte queste domande e queste cattive pratiche derivano da una cattiva comprensione dell'attributo statico in un'applicazione Web e dal modo in cui il server gestisce questi attributi. Qualsiasi aiuto su questo argomento sarebbe più che gradito. Grazie per il tuo tempo!

    
posta Ionut 05.05.2012 - 13:17
fonte

1 risposta

3

Questi sono problemi fondamentalmente risolti. È sufficiente creare una nuova connessione ogni volta che è necessario accedere al database (o forse solo una volta per richiesta, se ciò è facilmente possibile) e utilizzare un'API di database che supporti le connessioni in pool. Assicurati di chiudere tutte le connessioni, non importa cosa, ma è qualcosa che dovresti fare comunque. Non c'è bisogno di reinventare la ruota qui.

E posso notare che rendere la connessione al database un singleton è una pessima decisione di progettazione in primo luogo, a causa del problema esatto che hai incontrato. Non c'è assolutamente alcun motivo per far sì che ci sia sempre una sola connessione al database dalla tua applicazione.

    
risposta data 05.05.2012 - 13:26
fonte

Leggi altre domande sui tag