Domanda

Ho un database Apache Derby in esecuzione (in modalità di rete) all'interno di un'applicazione java swing, mi collego ad esso tramite chiamate JDBC dirette tramite un'applicazione client Java.

Questo è tutto molto buono e funziona benissimo, ma so che ho un requisito aggiuntivo per implementare licenze simultanee per questa applicazione client / server.

Idealmente un utente con una licenza per singolo utente dovrebbe essere in grado di avere 1 app client in esecuzione su un laptop e anche una seconda app client in esecuzione su un desktop ed essere in grado di connettersi al server da entrambi.

Non ho il lusso di un web server, quindi mi chiedo se la mia unica opzione è quella di utilizzare il "maxthreads" proprietà di runtime in Derby e essenzialmente costringono l'utente a disconnettersi dal laptop e dire se vogliono usare l'app dal loro desktop.

Se lascio la proprietà timeslice su 0, verrà inviata una chiamata al timeout getConnection in modo da poter visualizzare un messaggio per l'utente che spiega che è necessario disconnettere una delle app client.

I thread di connessione sono un modo affidabile per farlo?

Mi manca un'altra soluzione?

È stato utile?

Soluzione

Se capisco correttamente la domanda, hai licenze bloccate dall'utente e vuoi impedire a un singolo utente con una singola licenza di accedere al "server". da più di un'istanza del client alla volta. Il tuo " server " è semplicemente un database e non si desidera creare un livello applicazione sul lato server.

Non mi piace molto il tuo suggerimento iniziale di utilizzare il pool di thread e il timeout della connessione per applicare i vincoli di licenza perché entrambe le cose vengono utilizzate per altri scopi.

Invece, per risolvere questo problema, potrei considerare di richiedere all'utente di inserire il proprio numero di licenza nella GUI la prima volta che lo usano. Questo può essere salvato nella home directory dell'utente per i successivi avvii della GUI. Lo stesso accadrebbe se avessero avviato la GUI per la prima volta su un altro computer. Quindi, per ogni transazione che la GUI effettua con il database, aggiornerebbe prima una tabella delle licenze o simile per indicare che la licenza dell'utente sta attualmente partecipando a una transazione. Laddove la stessa licenza sia già presente nella tabella, contrassegnata come attiva o simile, la GUI rifiuta la transazione e visualizza all'utente la propria licenza già utilizzata da un altro client.

Se ti piace questa idea, pensaci più lontano di me. Riesco a vedere alcuni errori nella logica che blocca definitivamente gli utenti :-)

Altri suggerimenti

Sembra che tu voglia eseguire l'azione di " logging " e " logout " del database esplicito, quindi forse potresti avere una tabella speciale nel database in cui l'applicazione scrive un record quando accedi o esci.

Quindi l'applicazione può eseguire una query su quella tabella per scoprire se altre copie dell'applicazione sono attualmente connesse.

Potresti voler includere campi aggiuntivi nella tabella per tenere traccia della data / ora di accesso / disconnessione, nome host e indirizzo IP del client che ha eseguito il login / logout, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top