Bonjour,
quelqu'un aurait t-il un exemple de code plutot complexe gérant les pools de connexion (org.apache.common.pool).
Merci beaucoup.
Koko22
Bonjour,
quelqu'un aurait t-il un exemple de code plutot complexe gérant les pools de connexion (org.apache.common.pool).
Merci beaucoup.
Koko22
Demande des choses précises et je pourrais t'aider , je connais bien ce produit.
@+
Salut,
Je voudrais faire un pool d'Action.
Cordialement.
Koko22
toujours pour ton pool d'ActionStruts depuis le requestProcessor ?
Si tes besoins sont simples, je te conseille de prendre un pool de type stack :
http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/StackObjectPool.html
Sinon, un peu plus générique mais plus complexe a mettre en place:
http://jakarta.apache.org/commons/pool/apidocs/org/apache/commons/pool/impl/GenericObjectPool.html
Sinon tu peux aussi définir ta stratégie perso en impléùménetant les différentes interfaces fournis.
As -tu deja une certaines experiences avec les pools ? Ce n'est pas si simple de trouver la bonne stratégie.
Sinon mettre un pool d'action dans Struts n'a que peu d'interets, car les objets actions sont en général stateless et donc partagés et clonés entre différents threads du conteneur de servlet.
Ce n'est en tout cas pas un goulot d'etranglement.
@+
Salut RanDomX,
L'idée est de faire une Action unique. Etant donné que c'est géré par HashMap, et qu'il recupere une instance à partir du nom de la classe, tu te rends vite compte que la HashMap ne va contenir qu'un élement.
D'ou risque d'étranglement.
L'idée est de gérer une liste d'Action(Qui sera unique). La liste va contenir des élements similaires(puisque c'est la meme Action). D'ou l'idée de pool.
Je n'ai aucune experience dans la réalisation de pool de connection.
Cordialement.
Koko22
si tu as lu mon precedent message jusqu'au bout, jer t'ai expliqué pk il ne peut pas y avoir de risque d'étranglement.
Les Actions sont stateless et sont "dupliquées" par le JVM.
Efectivement tu n'as qu'une action ds la map (voir requestProcessor ds API struts) pou un nom donné.
A cet effet , les concepteurs de Strtus ont longtemps hésités à rajouter un flag "singleton" ds la declaration des actions ds Struts-config.
Au final, il ne l'ont pas fait. Ce qui tends à démontrer que les instance bien qu'unique résident en plusieurs exemplaires ds la VM ou tout au moins sont partagées.
Si effectivement tu as des action Statefull (qui modifie l'état interne de ton application, pas simplement font juste un calcul queconque), alors le pool s'avère interréssant.
Dans ce cas, et dans ce cas seulement, il va te falloir gerer la remise à zero des instances (pour en effacer les états), ainsi que la remise à dispo ds le pool.
Ce n'est pas une chose simple à faire si effectivement tu n'as aucune experience de pool.
A mon avis, si ton appli est antiperformante, penche toi d'abord sur le code que tu as ajouté, plutot que sur l'implémentation d'un framework plus qu'éprouvé.
Bon courage,
@+
Lionel
Salut RanDomX,
Voici ma Factory :
public class MyPoolFactory extends BasePoolableObjectFactory
{
public Object makeObject() throws Exception
{
Action act = new Action();
return act;
}
public void destroyObject(Object arg0) throws Exception
{
}
public boolean validateObject(Object arg0)
{
return true;
}
public void activateObject(Object arg0) throws Exception
{
}
public void passivateObject(Object arg0) throws Exception
{
}
}.
Voici mon main(Test) :
GenericObjectPool pool = new GenericObjectPool(new MyPoolFactory(),100,GenericObjectPool.WHEN_EXHAUSTED_FAIL,5,5);
pool.setMinIdle(5);
pool.setMaxIdle(5);
pool.setNumTestsPerEvictionRun(5);
Trace.warn(".","Avant emprunt");
Action act = (Action) pool.borrowObject();
Trace.warn(".","J'ai emprunte");
act.execute();
Action act2 = (Action) pool.borrowObject();
act2.execute();
Trace.warn(".","Apres emprunt: " + pool.getNumActive());
Trace.warn(".","Nbre max active ---->"+pool.getMaxActive());
Trace.warn(".","Num Idle---->"+pool.getNumIdle());
pool.returnObject(act);
pool.returnObject(act);
pool.returnObject(act);
pool.returnObject(act);
pool.returnObject(act);
pool.returnObject(act);
pool.returnObject(act);
Action act3 = (Action) pool.borrowObject();
Trace.warn(".","Action--->"+act3);
act3.execute();
Trace.warn(".","Rendu : " + pool.getNumActive());
Trace.warn(".","MaxIdle : " + pool.getMaxIdle());
Ce code gére les pools exactement comme un tableau. Il n'ya aucune création d'objet à l'init(Lors de l'appel du constructeur). Les objets sont crées quand je fais un borrowObject.
Koko22
Salut RanDomX,
Je pense que tu as tout à fait raison. Cela n'apporte rien. Merci beaucoup.
Koko22
Partager