Esecuzione di query su più istanze di database separate

2

Premessa

Ho un numero di server di database (diverse istanze DBMS, installazioni in diverse posizioni fisiche), ognuno di essi contiene dati e utilizza lo stesso schema. La maggior parte dei dati è completamente uguale su tutti i database, ma sfortunatamente non in tutti i casi.

Ho bisogno di scrivere un'applicazione che emetterà query ( seleziona solo , non inserisce, aggiorna o cancella) su una tabella attraverso tutti i database, recupera tutti i risultati in modo che lo strumento possa confrontarli per essere in grado di segnalare eventuali discrepanze agli utenti.

Usa caso

Ad esempio, immagina di avere un modulo basato sul Web, in cui gli utenti inseriscono i dettagli della società. L'invio del modulo rilascerà un inserto contro la stessa tabella in tutti i database (tramite connessione al database diversa, ciascuno separato). Mentre gli utenti digitano il nome dell'azienda, l'applicazione deve essere in grado di verificare che il valore inserito non esista in tutti i database. Se esiste o non esiste nei database tutti , tutto va bene. O il nome dell'azienda è preso o può essere utilizzato dall'utente. Tuttavia se il valore esiste su alcuni database, ma non su altri, devo generare un errore di convalida.

Il mio piano

Lo strumento che sto scrivendo è un'applicazione Java, che utilizza JDBC (che si connette a più database Oracle), quindi ora penso che creo una Connessione verso ciascuno dei miei server di database. Emetti la stessa query in parallelo, attendi i risultati e confrontali. Il mio caso d'uso riguarda una manciata di utenti e 5-10 diversi server di database (la migrazione del database o la replica slave / master è completamente fuori questione).

In passato ho risposto alla domanda di qualcuno che richiedeva una soluzione simile a quello che pensavo avrei dovuto fare adesso .

Domanda

Quali sono i modi possibili per gestire uno scenario come questo?

    
posta Kohányi Róbert 05.12.2015 - 09:39
fonte

4 risposte

2

Penso che quello che stai cercando sia Oracle Data Base Links.

CREA IL LINK DEL DATABASE

Use the CREATE DATABASE LINK statement to create a database link. A database link is a schema object in one database that enables you to access objects on another database. The other database need not be an Oracle Database system.

    
risposta data 28.02.2017 - 14:30
fonte
1

Tutti i prodotti RDBMS che mi vengono in mente hanno una funzione per collegare database e query su più database. Se questo è l'unico requisito che hai e non puoi prevedere altri requisiti per l'interrogazione cross-database, personalmente non mi affretto a collegare i database per fare ciò. Considererei tutti i potenziali aspetti negativi e penso attentamente. Sarei preoccupato di introdurre un impatto sulle prestazioni dal momento che i database non si trovano nella stessa posizione e potenzialmente potrebbero rendere il prodotto più difficile da supportare. Quest'ultimo dipenderà dal modo in cui è strutturata la tua organizzazione IT e dagli standard / pratiche stabiliti dagli amministratori di database.

Se non si scende il percorso del database collegato per questo requisito, avviarei thread in background in parallelo ognuno dei quali si connette e interroga ogni DB remoto per dati simili.

Stabilire la connessione a ciascun DB è un'operazione abbastanza costosa. Se la tua app si collega già a ciascuna periodicamente, il pool di database potrebbe essere d'aiuto in quanto il pool di DB manterrebbe le connessioni aperte e disponibili.

Un'altra cosa da considerare è che sembra che la tua app non sia proprietaria dei database e dei dati. Ovviamente, qualunque percorso tu faccia per collegarti al database di back-end di questa altra app proprietaria, potresti dipendere dall'altra app per non trasformare il suo modello di dati in un modo che rompe il tuo.

    
risposta data 28.02.2017 - 15:45
fonte
0

La tua applicazione è l'unico punto di aggiornamento in tutti i database? In caso contrario, avrai comunque un sacco di problemi con il dup.

D'altra parte, se la tua app è il singolo punto di aggiornamento, allora potresti usare una cache centralizzata usando NoSQL e usarla come cache write-through, prima di salvare gli aggiornamenti nei vari database in modo tale che tu possa solo è necessario interrogare quella cache per verificare la presenza di duplicati.

    
risposta data 05.12.2015 - 11:41
fonte
0

C'è un'alternativa ai thread.

Il caso d'uso che spieghi non sembra aver bisogno di essere sincrono.

Quindi potresti creare uno script che legge un database e scrive su una tabella temporanea. Tale script riceverà le informazioni di connessione tramite i parametri passati ad esso. In questo modo puoi pianificare cron jobs con gli stessi script ma diversi database che vengono eseguiti in parallelo in un dato momento.

Un secondo lavoro eseguirà il polling per vedere se quei lavori sono terminati e quindi eseguirà il confronto e memorizzerà i risultati in una tabella a punto singolo.

Il modulo di immissione dei dati potrebbe invece controllare con quelle tabelle pre-elaborate e, se i dati sono troppo vecchi (configurabili), dire all'utente di attendere una notifica in un'area di notifica per dare loro un senso di flusso di lavoro.

È solo una possibile alternativa.

Inoltre, se il modulo di immissione mostra all'utente un elenco a discesa di nomi esistenti, è possibile salvare il tempo di conferma dell'utente.

    
risposta data 01.08.2016 - 22:08
fonte

Leggi altre domande sui tag