Pool di oggetti in un ambiente Java EE

I server delle applicazioni Java EE forniscono la funzionalità del pool di connessioni che può essere utilizzata dalle applicazioni MDB (message - driven bean), Enterprise Java Beans e Servlet.

WebSphere® Application Server gestisce un lotto di connessioni ad un fornitore JMS , al fine di migliorare le prestazioni. Quando un'applicazione crea una connessione JMS , il server delle applicazioni determina se esiste già una connessione nel pool di connessioni libero. In tal caso, la connessione viene restituita all'applicazione; in caso contrario, viene creata una nuova connessione.

La Figura 1 mostra come le specifiche di attivazione e le porte listener stabiliscono una connessione JMS e utilizzano tale connessione per monitorare una destinazione per i messaggi in modalità normale.
Figura 1. Modalità normale
Un diagramma di flusso che mostra come le specifiche di attivazione e le porte listener stabiliscono una connessione JMS e utilizzano tale connessione per monitorare una destinazione per i messaggi.

Quando si utilizza il provider di messaggistica IBM® MQ , le applicazioni che eseguono la messaggistica in uscita (come i servlet e i bean Java enterprise) e il componente della porta del listener del bean basato sui messaggi, possono utilizzare questi pool di connessione.

Le specifiche di attivazione del provider di messaggistica IBM MQ utilizzano la funzionalità del pool di connessioni fornita dall'adattatore di risorse IBM MQ . Per ulteriori informazioni, consultare Configurazione delle proprietà per l'adattatore di risorse WebSphere MQ .

Esempi di utilizzo del lotto connessioni spiega come le applicazioni che eseguono la messaggistica in uscita e le porte listener utilizzano il lotto libero durante la creazione delle connessioni JMS .

Free connection pool maintenance threads spiega cosa accade a queste connessioni quando un'applicazione, o una porta listener, ha terminato le connessioni.

Esempi di thread di gestione pool spiega come il pool di connessioni libere viene ripulito per evitare che le connessioni JMS diventino obsolete.

WebSphere Application Server ha un limite sul numero di connessioni che possono essere create da un factory, specificato dalla proprietà connessioni massime del factory di connessione. Il valore predefinito per questa proprietà è 10, il che significa che possono essere create fino a 10 connessioni da un factory in qualsiasi momento.

Ogni factory ha un pool di connessioni libere associato. All'avvio del server delle applicazioni, i pool di connessioni liberi sono vuoti. Il numero massimo di connessioni che possono esistere nel lotto libero per un factory è specificato anche dalla proprietà Numero massimo di connessioni.

Suggerimento: con JMS 2.0, è possibile utilizzare una factory di connessione per creare connessioni e contesti. Come risultato, è possibile avere un pool di connessioni associato a un factory di connessione che contiene una combinazione di connessioni e contesti. Si consiglia di utilizzare una factory di connessione solo per creare connessioni o contesti. Ciò garantisce che il pool di connessioni per tale factory di connessione contenga solo oggetti di un singolo tipo, rendendo il pool più efficace.

Per informazioni sul funzionamento del pool di connessioni in WebSphere Application Server, consultare Configurazione del pool di connessioni per connessioni JMS. Per altri server delle applicazioni, fare riferimento alla documentazione appropriata del server delle applicazioni.

Modalità di utilizzo del lotto connessioni

Ogni factory di connessione JMS ha un pool di connessione associato e il pool di connessione contiene zero o più connessioni JMS . Ogni connessione JMS ha un pool di sessioni JMS associato e ogni pool di sessioni JMS contiene zero o più sessioni JMS .

La Figura 2 mostra le relazione tra questi oggetti.
Figura 2. Pool di connessioni e pool di sessione
Un diagramma di flusso che mostra la relazione tra le connessioni e sessioni JMS
Quando una porta listener viene avviata o un'applicazione che desidera eseguire la messaggistica in uscita utilizza il factory per creare una connessione, la porta o l'applicazione richiama uno dei seguenti metodi:
  • connectionFactory.createConnection()
  • ConnectionFactory.createConnection(String, String)
  • QueueConnectionFactory.createQueueConnection()
  • QueueConnectionFactory.createQueueConnection(String, String)
  • TopicConnectionFactory.createTopicConnection()
  • TopicConnectionFactory.createTopicConnection(String, String)
Il gestore connessioni WebSphere Application Server tenta di ottenere una connessione dal pool libero per questo factory e la restituisce all'applicazione.

Se non ci sono connessioni libere nel pool e il numero di connessioni create da questo factory non ha raggiunto il limite specificato nella proprietà Numero massimo di connessioni di tale factory, Connection Manager crea una nuova connessione per l'applicazione da utilizzare.

Tuttavia, se un'applicazione tenta di creare una connessione, ma il numero di connessioni create da questo factory è già uguale alla proprietà connessioni massime del factory, l'applicazione attende che una connessione diventi disponibile (per essere reinserita nel pool libero).

Il tempo di attesa dell'applicazione è specificato nella proprietà timeout connessione del lotto connessioni, che ha un valore predefinito di 180 secondi. Se una connessione viene reinserita nel lotto libero entro questo periodo di 180 secondi, Connection Manager la rimette immediatamente fuori dal lotto e la trasmette all'applicazione. Tuttavia, se il periodo di timeout scade, viene lanciata una ConnectionWaitTimeoutException.

Quando un'applicazione ha terminato la connessione e la chiude richiamando:
  • Connection.close()
  • QueueConnection.close()
  • TopicConnection.close()
la connessione viene effettivamente tenuta aperta e viene restituita al pool libero in modo che possa essere riutilizzata da un'altra applicazione. Pertanto, è possibile avere connessioni aperte tra WebSphere Application Server e il provider di JMS , anche se nessuna applicazione JMS è in esecuzione sul server delle applicazioni.