2009-06-02 7 views
9

Sulla base di una risposta, ho ottenuto here, ho iniziato a dare a commons-pool un aspetto serio. La mia ultima esperienza di utilizzo è stata intorno al 2003, probabilmente versione 1.1 o 1.2. Il suo utente principale, DBCP, è considerato da molti come difettoso e da evitare.Suggerimenti per l'utilizzo di piscina comune in produzione

Qualcuno usa i comuni in produzione per scrivere un proprio pool? Qual è il miglior tipo di piscina da usare? Intendo memorizzare i socket del client in esso.

C'è un altro pool generico che lo sostituisce?

+0

Questo è il primo che ho sentito sul fatto che DBCP sia difettoso ... hai qualcosa di più specifico? – skaffman

+0

@skaffman - per lo più ha perso le connessioni senza un motivo –

+0

Questo è interessante: http://static.springsource.com/projects/tc-server/6.0/admin/radmjdbc.html ... menziona l'inadeguatezza di DBCP. Non molto d'aiuto, però, dato che è closed source. – skaffman

risposta

7

Qualcuno usa il comune nella produzione per scrivere il proprio?

Sì, lo faccio e il pool contiene connessioni TCP, come tu hai intenzione di fare. E 'cablato via Primavera, assumendo così si capisce la configurazione Primavera:

<bean class="com.company.ConnectionSupplier"> 
<constructor-arg> 
    <!-- The ConnectionSupplier wraps an object pool --> 
    <bean class="org.apache.commons.pool.impl.GenericObjectPool"> 
    <constructor-arg> 
     <!-- The ObjectPool uses a ConnectionFactory to build new connections --> 
     <bean class="com.company.ConnectionFactory"> 
     <constructor-arg value="server" /> 
     <constructor-arg value="3000" /> 
     </bean> 
    </constructor-arg> 
    <property name="maxActive" value="20" /> 
    <property name="testOnBorrow" value="true" /> 
    </bean> 
</constructor-arg> 
</bean> 

Il ConnectionFactory estende BasePoolableObjectFactory ed è un piccolo involucro attorno a un SocketFactory.

@ Primo commento: Il costruttore ConnectionFactory accetta un server e una porta. Nell'overridato makeObject(), crea i socket che si connettono a quel server e alla porta. Restituisce oggetti 'Connection' che racchiudono il socket creato con alcuni metodi di convenienza per comunicare attraverso il socket.

La connessione viene testata utilizzando una sorta di "ping" o "echo" fornito dal protocollo utilizzato per comunicare tramite socket. Se questo non fosse disponibile, la convalida/verifica della connessione non è realmente possibile, tranne che per chiedere alla presa se è stata chiusa. In tal caso, una connessione nel pool sarebbe stata invalidata se ha generato un'eccezione e ogni metodo che utilizza Connections dovrebbe essere preparato per quel tipo di errore e tentare la stessa operazione con un'altra connessione.

+0

Come avete implementato il factory di connessione? Come testate la connessione per essere vivi? –

0

Check out MultiThreadedHttpConnectionManager - Si tratta di un gestore di pool di connessioni HttpClient di Apache Commons che probabilmente si adatta alle tue necessità fin da subito.

+1

Come ho scritto, ho bisogno che il pool contenga socket TCP, non connessioni HTTP. –

0

Per prima cosa non utilizzare commons-pool 1.3, presenta alcuni problemi principali con le applicazioni multi-thread.

In secondo luogo, Java 5 pacchetto concurency ha implementazioni piscina decente (vedi esempio here)

+0

C3p0 ti consente di utilizzare il suo pool senza le informazioni JDBC? –

+0

Sono stato corretto, rimosso c3p0, ma la mia osservazione 1.3 commons-pool non ha prezzo, mi ci sono voluti anni per trovarla in produzione. prestazioni saltate in modo substrato dopo l'aggiornamento a 1.4 ... –

+3

Stiamo usando 1.5 ... Java 5 ha in effetti un buon * Thread * Pool ma stavamo cercando un * Object * Pool –

1

Si dovrebbe controllare che i costi instantation più o il recupero dalla piscina. Perché l'unica situazione valida per utilizzare il pool è la prima.

+0

Non riesco a creare un'istanza di nuovi oggetti, poiché gli oggetti sono client Socket TCP che devono essere vivi il più a lungo possibile. Chiudere e aprire le connessioni è considerato come un attacco DOS. –

+0

FYI: stiamo usando GenericObjectPool di commons-pool in un'area diversa ma funziona molto bene. –

1

Hai esaminato Netty o Apache MINA? Entrambi terranno traccia delle connessioni TCP e dovrebbero implementare qualsiasi protocollo di comunicazione che i socket TCP useranno anche più facilmente.

+0

Per quanto ne so, sono usati per implementare server, non client. Posso usarli per implementare i pool tcp CLIENT? –

+1

Sì. Sia Netty che MINA ti permettono di scrivere anche un client. – trustin

Problemi correlati