2014-07-10 2 views
0

저는 현재 미적분을 수행하는 Java 응용 프로그램을 개발 중입니다. 내 응용 프로그램은 jar 파일로 배포 될 것이고 각각의 미적분을 위해 수행해야 할 것은 jar 파일을 시작하는 스크립트를 사용할 것입니다. 내 문제는 다음과 같습니다. 데이터베이스 질의를 수행하기위한 싱글 톤 클래스를 만들었지 만 두 번의 jar 실행 사이에 JVM에서 내 싱글 톤을 수정하는 방법을 알지 못합니다. 싱글 톤을 저장하고 무한히 기다리는 비어있는 클래스를 실행하려고 시도했지만, 내 항아리 프로그램을 실행할 때 싱글 톤은 검색되지 않지만 인스턴스화되지 않습니다 ... 내 코드는 다음과 같습니다.JVM에서 싱글 톤을 수정하는 방법은 무엇입니까?

메인 프로그램 JVM의 싱글 :

/** 
* Entry point for the singleton generation 
* @author yann.blanc 
* 
*/ 
public class MainSingleton { 
    /** 
    * Entry point 
    * @param args Command line arguments, used to define the request type 
    */ 
    public static void main (String[] args) { 
     try { 
      /*Here my singleton is instantiated*/ 
      DatabaseServiceSingleton service = DatabaseServiceSingleton.getInstance(); 
      while (true) 
      { 
       Thread.sleep(1000); 
      } 
     } catch (ServiceException e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      System.exit(0); 
     } 
    } 
} 

내 싱글 : 그렇지 않은 이유

public final class DatabaseServiceSingleton implements IDatabaseService { 

    private static DatabaseServiceSingleton instance = null; 

    /*PARAM and FUNCTIONS OMIT FOR A BETTER READABILITY*/ 

    /*Constructor with exception to ensure that clients are stopped if the singleton can't be instantiated*/ 
    private DatabaseServiceSingleton() throws ServiceException { 
     try { 
      /*Get the current path*/ 
      String urlCourante = getClass().getProtectionDomain().getCodeSource().getLocation().getFile(); 
      String[] tab; 
      if(urlCourante.contains("\\")){ 
       tab = urlCourante.split("\\"); 
      } else { 
       tab = urlCourante.split("/"); 
      } 
      for(int i = 0; i < tab.length -1; i++) { 
       pathFolder += tab[i]; 
      } 
      /*Get configuration informations*/ 
      getConfiguration(); 
      /*Init database connectors*/ 
      initBaseConnexion(); 
      System.out.println(this.getClass().getClassLoader().toString()); 
     } catch (Exception e) { 
      throw new ServiceException("Problème d'entrée sortie lors de la lecture du fichier " 
        + "de configuration. Le service n'a pas pu être instancié : "+e.getMessage()); 
     } 
    } 

    /*Method for retrieve the singleton instance*/ 
    public static synchronized DatabaseServiceSingleton getInstance() throws ServiceException { 
     if (instance == null) { 
      instance = new DatabaseServiceSingleton(); 
     } 
     return instance; 
    } 
} 

나는 그것이 작동 것이라고 확신했다가 ... 당신이 나를 설명 할 수 있습니까? 도움말 :

편집 주셔서 감사합니다 : I 클래스 로더를 확인했고 항상

+1

싱글 톤은 JVM에서 고유합니다. 하지만 2 개의 jars 실행 = 2 JVM. 당신의 필요는 정확히 무엇입니까? –

+0

"내 항아리 프로그램을 실행할 때 싱글 톤이 검색되지는 않지만 인스턴스가 생성되지 않습니다."- 무슨 뜻인지 알 수 있습니까? 그 질문은 나에게 분명하지 않다. – Swapnil

+0

@ArnaudDenoyelle JVM에서 항상 실행되는 의사 서비스를 만들고 내 jar 프로그램에서 액세스 할 수 있어야합니다. 전에 RMI를 사용하고 있었지만 프로그램이 로컬에서 실행되기 때문에 싱글 톤 솔루션을 시도했습니다 ... – Ko2r

답변

1

싱글 톤은 동일한 JVM * 내에서 지정된 클래스 의 단일 인스턴스가 보장하는 디자인 패턴입니다

당신이 (2 개 가지의 JVM 사이의 싱글 인스턴스를 공유 할 일은 노력하고 각 java.exe 프로세스는 별도의 jvm입니다). 너는 그것을 할 수 없다. 지금 당장, 각 자바 프로세스 (== jvm)는 자신의 싱글 톤 인스턴스 @startup을 초기화 할 것이므로 (따라서 자신의 연결을 유지할 것이다).

일 수 있습니다. 3 번째, 배경, 프로세스 (따라서 3 번째 jvm)에서 db 연결을 유지하고 같은 머신에서 실행중인 다른 모든 jvms를 프록시). 이렇게하면 코드가 복잡해지고 아마도 필요하지 않을 것입니다.

* 그리고 그 경우에도 클래스 로더 계층 구조와 관련된 시나리오가 있습니다.

+0

내 싱글 나는이 싱글 톤을 공유 할 수 있다고 생각했다. GRR 나는 다른 방법으로 서비스를 검색 할 것이다 (아마도 RMI로 되돌아 갈 것이다 ...). 이 작업을 수행하는 가장 간단한 방법에 대한 아이디어가 있습니까? – Ko2r

+0

@ Ko2r - 간단하고 RMI는 일반적으로 여러 개의 연결을 갖는 것에 대해 매우 나쁜 점이 무엇입니까? – radai

+0

나의 연결은 길다 (나는 HBase와 MySQL에 연결하고있다. 약 5 초 걸린다). 그리고 나의 미적분은 빠른 처리가되어야한다. 그래서 나는 나의 데이터베이스를 질의하기위한 서비스를 만들었다. ... – Ko2r

0

당신이 java -jar ... 새로운 JVM과 함께 항아리를 실행할 때마다 (단지 응용 프로그램과 MainSingleton에 대한) 동일합니다 ist가 시작되었습니다. 이전 실행에서 개체를 사용할 수 없습니다.

관련 문제