Utilizzo della connessione al database su più thread

0

diciamo che ho una connessione al database nella classe Database che offre i seguenti metodi pubblici

public synchronized void open() {}
public synchronized void close() {}
public synchronized void addData(Object data) {}

Il mio programma principale ha il seguente aspetto:

Database databaseConnector = new Database();

for (Feed feed : feedList) {
    Timer timer = new Timer();
    FeedTimerTask timerTask = new FeedTimerTask(feed, databaseConnector, stopWords);
    // Run the task every five minutes.
    timer.scheduleAtFixedRate(timerTask, 0, 1000 * 60 * 5);
}

È facile vedere che un numero sconosciuto di thread viene ripetuto ogni 5 minuti. Questi thread stessi leggono i dati da un feed e provano a salvarlo in un database in seguito.

Dal momento che utilizzano tutti la stessa connessione Database , non mi sembra intelligente a open() e close() la connessione per ogni feed. Soprattutto perché un lettore può chiudere la connessione mentre un altro sta ancora cercando di scrivere qualcosa su questo feed.

Invece ho pensato che volevo qualcosa come questa linea temporale:

(open) (write1) (write2) ... (writeN) (close) ... (wait 5 mins) (open) ... (close)

L'idea è che ogni 5 minuti venga aperta esattamente la connessione one e dopo che tutti i thread hanno scritto i loro dati, si chiude di nuovo. Finora, ho la seguente soluzione.

Ho aggiunto private int openConnections; al Database e ho modificato il codice come segue:

public synchronized void open() {
    if(openConnections++ == 0) {
        // Connect to the database, because we were not connected before
    }
}

public synchronized void(close) {
    if(--openConnections == 0) {
        // Close to the connections because this was the last one
    }
}

Ora, in ogni discussione, faccio quanto segue:

db.open();
db.addData(...);
db.close();

Con questa strategia, è sempre selezionata, se c'è ancora bisogno di una connessione aperta e in tal caso, la connessione non viene chiusa. E non ho intenzione di avere più thread di MAX_INT . La mia domanda è: è una buona idea? Ci sono modi migliori per ottenere lo stesso comportamento? Funziona perfettamente ma mi chiedo se c'è un'altra soluzione che preferirei.

    
posta Freddy 20.06.2016 - 20:23
fonte

1 risposta

3

Utilizza il pool di connessioni del database. Non consiglio di scriverne uno tuo. Ecco una spiegazione su StackOverflow . Puoi utilizzare c3p0 o leggere di più da solo cercando "pool di connessioni".

    
risposta data 20.06.2016 - 20:54
fonte

Leggi altre domande sui tag