1

内部 SqlLite db を使用して Java Swing アプリケーションを実行する実行可能 jar があります。ユーザーが (誤って) jar をクリックする以上の操作を行うと、db ロックが発生します。このような行為を防止したいと考えています。私に何ができる?どうもありがとうございます

4

3 に答える 3

1

ある種の同期メカニズムが必要です。

自分でコーディングする必要があるか、アプリケーション用の Java WebStart 構成を作成して、Java WebStart が Single Instance Service (コードで明示的に呼び出す必要がある) を介して「1 回だけの呼び出し」を処理できるようにすることができます。

例については、 http://docs.oracle.com/javase/6/docs/technotes/guides/javaws/developersguide/examples.html#SingleInstanceServiceを参照してください。

于 2012-11-26T10:36:56.593 に答える
0

JPS または JNI を使用できます (別のプラットフォームに実装する必要があります)。添付は、Java アプリケーション インスタンスをチェックするための JPS コードです。さらにOOに変更できます。

ファイル、ソケット、またはレジストリをロックとして使用することは完全ではありません。操作を誤ると、アプリケーションを起動できなくなる可能性が高いためです (たとえば、別のプログラムが同じポートを占有するなど)。


import java.io.*;

public class TestRun {

      public TestRun() {}



      public static void main(String args[]) {



            String jpsApp = "jps -mlvV";
            int count = 0;
            try {

                  Process p = Runtime.getRuntime().exec(jpsApp);
                  //parser the result to check if TestAPP is running

                  InputStream is = p.getInputStream();

                  BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                  String line = null;

                  while ((line = reader.readLine()) != null) {

                        System.out.println();

                        System.out.println(line);

                        String[] pair = line.split(" ");

                        if (pair.length >= 2) {

                              System.out.println("name is " + pair[1]);

                              if (pair[1].trim().indexOf("TestRun") > -1) {

                                    count++;

                                    System.out.println("count is " + count);

                              }

                        }

                  }
                  //it is running, just exit the second instance

                  if(count>1){


                        System.out.println("Has run a application!");
                        return;

                  } 

            } catch (Exception ex) {

                  ex.printStackTrace();

            }


      }

}
于 2012-11-26T10:44:39.587 に答える
0

データベースにアクセスする最初のインスタンスは、データベースで何らかのロックを取得する必要があり、それ以降のすべてのインスタンスは、そのようなロックが既に存在するかどうかを最初に確認する必要があります。ある場合 -> 「私は最初ではありません。警告/エラーを表示して終了します。」、ない場合は「私が最初です。ロックを取得して続行します。」

于 2012-11-26T10:33:50.783 に答える