Apache Derbyデータベースへの同時アクセスの管理
-
06-07-2019 - |
質問
Javaスイングアプリケーション内で(ネットワークモードで)実行されているApache Derbyデータベースがあり、Javaクライアントアプリケーションを介した直接JDBC呼び出しを介して接続します。
これはすべて非常に優れており、うまく機能しますが、このクライアント/サーバーアプリケーションに同時使用ライセンスを実装するための追加要件があることを知っています。
理想的には、単一のユーザーライセンスを持つユーザーは、ラップトップで1つのクライアントアプリを実行し、デスクトップで2番目のクライアントアプリを実行し、両方からサーバーに接続できる必要があります。
私は贅沢なウェブサーバーを持っていないので、「maxthreads」を使用することが私の唯一の選択肢かどうか疑問に思っています。 Derbyのランタイムプロパティを使用して、ユーザーがデスクトップからアプリを使用するかどうかをラップトップからログオフするようユーザーに強制します。
timesliceプロパティを0のままにすると、getConnectionタイムアウトの呼び出しが行われ、クライアントアプリの1つを切断する必要があることを説明するメッセージをユーザーに表示できます。
接続スレッドはこれを行うための信頼できる方法ですか?
別のソリューションがありませんか?
解決
質問を正しく理解している場合、ユーザーがロックされたライセンスを所有しており、単一のライセンスを持つ単一のユーザーが「サーバー」にアクセスできないようにしたい。一度に複数のクライアントのインスタンスから。あなたの「サーバー」は単なるデータベースであり、サーバー側にアプリケーションレイヤーを作成する必要はありません。
ライセンス制約を強制するためにスレッドプールと接続タイムアウトを使用するという最初の提案は、それらの両方が他の目的で使用されるため、私は本当に好きではありません。
代わりに、これを解決するために、最初に使用するときにライセンス番号をGUIに入力することをユーザーに要求することを検討します。これは、ユーザーのホームディレクトリに保存して、その後GUIを起動できます。別のマシンで初めてGUIを起動した場合も同じことが起こります。次に、GUIがデータベースに対して行うトランザクションごとに、まずライセンステーブルなどを更新して、ユーザーのライセンスが現在トランザクションに参加していることを示します。同じライセンスがすでにアクティブであるなどのマークがテーブルにある場合、GUIはトランザクションを拒否し、ライセンスが別のクライアントによって既に使用されていることをユーザーに表示します。
このアイデアが気に入ったら、私が考えている以上に考えてみてください。ユーザーを永続的にロックアウトするロジックにいくつかのエラーがあります:-)
他のヒント
「ログイン」のアクションを実行したいようです。および「ログアウト」データベースの明示的なため、ログインまたはログアウトするときにアプリケーションがレコードを書き込むデータベースに特別なテーブルが必要になる場合があります。
その後、アプリケーションはそのテーブルを照会して、アプリケーションの他のコピーが現在ログインしているかどうかを確認できます。
ログイン/ログアウトした日時/ログイン/ログアウトを実行したクライアントのホスト名とIPアドレスなどを追跡するために、テーブルに追加フィールドを含めることができます。