2013-07-18 18 views
15

Se distribuisco ed eseguo 2 istanze della stessa applicazione su una singola istanza di Tomcat (o qualsiasi altro server). Poi si creerebbe un singolo oggetto (di una classe Singleton):Singleton su JVM o istanza dell'applicazione o istanza Tomcat

  1. Attraverso singola istanza di Tomcat (ma comune per 2 istanze della stessa applicazione) OR
  2. Across istanza dell'applicazione (diversi per 2 casi di applicazione)

Quindi, in sostanza, voglio capire che è sempre un caso che un singolo oggetto della classe Singleton venga creato per JVM? Come funziona in caso di applicazione ospitata su un server Web (o contenitore).

risposta

23

Se si dispone di una classe singleton e si eseguono due webapp che utilizzano questa classe in Tomcat, entrambe le applicazioni web otterranno 2 diverse istanze di questo singleton in JVM che esegue Tomcat.

Ma se la tua webapp userà un singleton dalle librerie condivise di JRE o Tomcat, ad es. Le applicazioni web di Runtime.getRuntime avranno la stessa istanza di Runtime.

Questo perché Tomcat utilizza caricatori di classi individuali per le applicazioni web. Quando un caricatore di classi webapp carica una classe, tenta innanzitutto di trovarla sul percorso della classe webapp, se la classe non viene trovata chiede al programma di caricamento della classe padre di caricare la classe.

+2

@Evgenniy, Ciò significa che nella mia singola applicazione posso creare 2 oggetti singleton utilizzando caricatori di classi diverse (solo un pensiero). ?? – Learner

+1

Sì, crea 2 classloader (puoi utilizzare URLClassLoader), carica la stessa classe con ClassLoader.loadClass (className) - otterrai 2 diverse istanze di classe –

+0

Significa che Singleton è danneggiato? – Learner

1

<shakey-ground> Per quanto ne so, un singleton è univoco per classloader. Quindi penso che la risposta alla tua domanda dipenda dal modo in cui il contenitore carica l'applicazione web.

Se assegna un classloader per applicazione Web, sembra che otterresti due oggetti singleton completamente indipendenti. Se assegna un classloader e tutte le app Web lo usano, allora condividono la stessa istanza singlet. </shakey-ground>

14

Un singleton è normalmente collegato solo a ClassLoader.

Quindi, se si dispone di un singleton basato su un file .class nel file .war e si distribuisce questa applicazione Web più volte, ciascuna applicazione ottiene il proprio singleton.

D'altra parte, se il file .class del singleton si trova nel classpath di tomcat, allora si ha solo un'istanza. Questo .class non appartiene a una specifica applicazione Web (appartiene all'istanza tomcat).

Se si dispone del singleton in entrambe le posizioni, dipende dalla gerarchia del programma di caricamento classi e è possibile selezionare "prima genitore" o "prima applicazione web".

+0

@Beryllium cosa intendi per "classpath di tomcat"? Intendo dove devo purificare la mia classe/jar in modo da ottenere singleton attraverso le applicazioni. – Vipin

+0

@vipin Non posso dirlo con certezza, perché ultimamente non l'ho fatto, ma provate a inserire un file .jar nella cartella lib/della tomcat. Per quanto riguarda JBoss 7, fanno effettivamente lo stesso, lo organizzano semplicemente come "moduli". – Beryllium

+0

@Beryllium molto indietro Ho letto un articolo che dice che non dovremmo inserire nessuno dei nostri jar in tomcat/lib. Recentemente ho fatto qualche ricerca e ho scoperto che possiamo usare l'attributo shared.loader di catalina.properties. Ma non sono sicuro che funzionerà o no. – Vipin

4

È possibile creare un tale singleton assicurando di interrogare sempre lo stesso ClassLoader per il singleton. Ho scritto un extensive explanation in questa altra risposta.

1
  • Tomcat crea un nuovo caricatore di classi per ogni applicazione Web.
  • Quindi, se la classe Singleton è memorizzata in un file di guerra, lo stesso file di guerra avrà due istanze nel contenitore Tomcat, ovvero crea due classi Singleton separate per ciascun file di guerra.
  • Se la classe Singleton si trova nel percorso della libreria di condivisione di Tomcat, Tomcat crea solo un'istanza Singleton per entrambe le applicazioni.

JVM analogia:

JVM è come grande villa. Contiene famiglia combinata con applicazioni e librerie server.

I ClassLoaders sono membri della famiglia, ogni membro della famiglia rappresenta un ClassLoader (funziona come gerarchia dei delegati e non gerarchia di eredità). Nota: ClassLoader è di classe, può creare più istanze.

Le applicazioni sono come un elettrodomestico. per esempio: lavatrice, frigorifero, aria condizionata, telivisione, tavolo da pranzo, divano e così via ...

Le biblioteche sono tutte dotate di una propria biblioteca personale. Ognuno cerca nel liberatore del genitore se non lo trova, quindi cerca nella sua biblioteca.

limitazioni: Se il padre compra un elettrodomestico, i suoi figli possono usarlo, ma non può essere utilizzato dal genitore e dalle sibilazioni. Ogni applicazione potrebbe utilizzare versioni diverse delle stesse librerie. Ad esempio, se la libreria contiene due o più versioni di uno stesso libro, sceglie prima quale libro è disponibile.

Ogni numero di famiglia può utilizzare solo un dispositivo univoco.

In casa, è possibile utilizzare l'appliance mulitple della stessa versione. Quindi, JVM ci consente di eseguire più applicazioni delle stesse versioni.

Garbage Collector è un servitore di Mansion, che si aggira come un daemon, che può cancellare qualsiasi tipo di oggetto.

L'ambito di una variabile statica è limitato a uno per ClassLoader.

Problemi correlati