2

JavaSwingアプリケーション内でApacheDerbyデータベースを(ネットワークモードで)実行しています。Javaクライアントアプリケーションを介して直接JDBC呼び出しを介してデータベースに接続します。

これはすべて非常に優れており、うまく機能しますが、このクライアント/サーバーアプリケーションの同時ライセンスを実装するための追加要件があることを私は知っています。

理想的には、単一のユーザーライセンスを持つユーザーは、ラップトップで1つのクライアントアプリを実行し、デスクトップで2番目のクライアントアプリを実行し、両方からサーバーに接続できる必要があります。

私はWebサーバーの贅沢を持っていないので、私の唯一のオプションはDerbyの「maxthreads」ランタイムプロパティを使用することであり、基本的にユーザーがラップトップからログオフする必要があるかどうかを疑問に思っています。デスクトップからのアプリ。

タイムスライスプロパティを0のままにすると、getConnectionタイムアウトが呼び出され、クライアントアプリの1つを切断する必要があることを説明するメッセージをユーザーに表示できます。

接続スレッドはこれを行うための信頼できる方法ですか?

私は別の解決策を逃していますか?

4

2 に答える 2

0

私が質問を正しく理解していれば、ユーザーロック ライセンスがあり、1 つのライセンスを持つ 1 人のユーザーがクライアントの複数のインスタンスから一度に「サーバー」にアクセスできないようにしたいと考えています。「サーバー」は単なるデータベースであり、サーバー側にアプリケーション層を作成したくない場合。

スレッドプールと接続タイムアウトを使用してライセンスの制約を適用するという最初の提案はあまり好きではありません。これらは両方とも他の目的に使用されるためです。

代わりに、これを解決するために、ユーザーが初めて GUI を使用するときに、ライセンス番号を GUI に入力するように要求することを検討するかもしれません。これは、後で GUI を開始するために、ユーザーのホーム ディレクトリに保存できます。別のマシンで初めて GUI を起動した場合も同様です。次に、GUI がデータベースで行うトランザクションごとに、最初にライセンス テーブルなどを更新して、ユーザーのライセンスが現在トランザクションに参加していることを示します。同じライセンスが既にテーブルにある場合、アクティブとしてマークされている場合、または同様の場合、GUI はトランザクションを拒否し、ライセンスが別のクライアントによって既に使用されていることをユーザーに表示します。

このアイデアが気に入ったら、私よりも深く考えてみてください。ユーザーを永久にロックアウトするロジックにいくつかのエラーが見られます:-)

于 2009-09-11T20:39:24.080 に答える
0

データベースの「ログイン」と「ログアウト」のアクションを明示的にしたいように思われるので、ログインまたはログアウトするときにアプリケーションがレコードを書き込むデータベースに特別なテーブルが必要になる場合があります。

次に、アプリケーションはそのテーブルをクエリして、アプリケーションの他のコピーが現在ログインしているかどうかを確認できます。

ログイン/ログアウトした日時、ログイン/ログアウトを実行したクライアントのホスト名と IP アドレスなどを追跡するために、テーブルに追加のフィールドを含めることができます。

于 2009-10-21T04:17:48.637 に答える