Pseudo-Archive Java :
Accueil -|- Visuel -|- Logistique -|- Applications réparties
La pseudo-archive Java est un service proposé par la SARL diaam informatique, et il est hébergé par la Sogid.
diaam informatique
From:           	Arnaud de la Sudrie <adelasudrie@phonevalley.com>
To:             	<java@u-strasbg.fr>
Subject:        	bdd
Date sent:      	Thu, 21 Jun 2001 09:34:26 +0200
Send reply to:  	java@u-strasbg.fr

Bonjour à tous


J'ai une base de donnée postgreSQL. Mes servlets accèdent à la base à
l'aide d'un driver JDBC. Pour optimiser les traitements, j'utilise des
pools de connexion. Je souhaite insérer 1000 enregistrements dans une
table (il n'y a pas d'index sur cette table). En insérant 1000
enregistrements séquentiellement dans la table, cela prend 1min30. Pour
optimiser, j'ai crée des threads qui insèrent les enregistrements dans la
base. Mes threads fonctionnent bien, cependant, le temps n'est que
légèrement optimisé : 70 sec pour 1000 enregistrements. J'ai crée le même
nombre de threads qu'il y a de connexions dans mon pool. En ajoutant des
connexion au pool et en augmentant le nombre de threads, j'obtient
toujours environ le même temps. Est ce normal? La base limite t'elle le
nombre d'insertions "simultanées". Je trouve cela tout de même très long.

 Arnaud de La Sudrie

     

From:           	Laurent Forêt <l.foret@korom.net>
To:             	<java@u-strasbg.fr>
Subject:        	RE: bdd
Date sent:      	Thu, 21 Jun 2001 10:08:26 +0200
Send reply to:  	java@u-strasbg.fr



> -----Message d'origine-----
> De : Arnaud de la Sudrie [mailto:adelasudrie@phonevalley.com]
> Envoyé : jeudi 21 juin 2001 09:34
> À : java@u-strasbg.fr
> Objet : bdd
>
>
> Bonjour à tous
>
>
> J'ai une base de donnée postgreSQL. Mes servlets accèdent à la
> base à l'aide
> d'un driver JDBC. Pour optimiser les traitements, j'utilise des pools de
> connexion. Je souhaite insérer 1000 enregistrements dans une table (il
> n'y a pas d'index sur cette table). En insérant 1000 enregistrements
> séquentiellement dans la table, cela prend 1min30. Pour optimiser, j'ai
> crée des threads qui insèrent les enregistrements dans la base. Mes
> threads fonctionnent bien, cependant, le temps n'est que légèrement
> optimisé : 70 sec pour 1000 enregistrements. J'ai crée le même nombre de
> threads qu'il y a de connexions dans mon pool. En ajoutant des connexion
> au pool et en augmentant le nombre de threads, j'obtient toujours
> environ le même temps. Est ce normal? La base limite t'elle le nombre
> d'insertions "simultanées". Je trouve cela tout de même très long.
>
> 	Arnaud de La Sudrie
>
>

Ca me parait effectivement lent la base de donnée se trouve où, en local
sur la machine ou loin ?

Le goulet d'étranglement se passe surement au niveau de l'accés à la base
de donnée, non pas au niveau de vos threads.

Pour info, j'avais fait des tests sur une bdd local avec un driver odbc,
sans pool de connection : le test était 2 boucles for imbriqués:

1 connection de 10 000 insertions ==> durèe du test : 37 secondes.
10 connections de 1 000 insertions ==> durèe du test : 35 secondes.
100 connections de 100 insertions ==> durèe du test : 43 secondes.
1 000 connections de 10 insertions ==> durèe du test : 114 secondes.
10 0000 connections de 1 insertion ==> durèe du test : 810 secondes.

-------------------------------------

Laurent Forêt

Service développement

l.foret@korom.net

www.korom.net

     

Date sent:      	Thu, 21 Jun 2001 10:10:34 +0200
From:           	Laurent Vallar - aka Val <laurent.vallar@linuxfr.org>
To:             	java@u-strasbg.fr
Subject:        	Re: bdd
Send reply to:  	Laurent Vallar - aka Val <laurent.vallar@linuxfr.org>
Organization:   	"DaLinuxFrenchTeam - LinuxFR - http://www.LinuxFR.org"

On Thu,Jun,21,2001, Arnaud de la Sudrie wrote:
> Subject: bdd
> 
> Bonjour à tous
> 

Bonjour :)

> 
> J'ai une base de donnée postgreSQL. Mes servlets accèdent à la base à
> l'aide d'un driver JDBC. Pour optimiser les traitements, j'utilise des
> pools de connexion. Je souhaite insérer 1000 enregistrements dans une
> table (il n'y a pas d'index sur cette table). En insérant 1000
> enregistrements séquentiellement dans la table, cela prend 1min30. Pour
> optimiser, j'ai crée des threads qui insèrent les enregistrements dans
> la base. Mes threads fonctionnent bien, cependant, le temps n'est que
> légèrement optimisé : 70 sec pour 1000 enregistrements. J'ai crée le
> même nombre de threads qu'il y a de connexions dans mon pool. En
> ajoutant des connexion au pool et en augmentant le nombre de threads,
> j'obtient toujours environ le même temps. Est ce normal? La base limite
> t'elle le nombre d'insertions "simultanées". Je trouve cela tout de même
> très long.
> 

Utilises-tu des transactions pour faire tes INSERT par blocs ? As-tu
modifié la taille des buffers de PostgreSQL (aprés étude des demandes
d'allocation mémoire du postmaster) ? As-tu essayé la commande copy sur le
backend de PostgreSQL pour réliser tes INSERT à l'aide d'un fichier à plat
de données éventuellement généré par ton application (si tu peux accéder
aux commandes clientes classiques via ton application Java) ?

Sinon je pige pas trop ton coup des pools de connexions utilisés par des
threads pour paralléliser (je pense) les INSERT, cela ne génére-t-il pas
trop de lock() sur la base, et dégraderai les performance ? En tout ca ça
m'interresse, peux-tu me tenir au courant ?

Val.
-- 
Laurent Vallar aka Val - Manager of Architecture and Software Development
Dep. Work : http://SecurityKeepers.com -
mailto:Laurent.Vallar@SecurityKeepers.com Home :
http://perso.LinuxFR.org/vallar/ - mailto:Laurent.Vallar@LinuxFR.org Asso
: Da Linux French Team - LinuxFR - http://www.LinuxFR.org - Geek Stuff !
-= Want some woody packages on your potato, uh ? http://debian.linuxfr.org
=-

C'est fini ! Retour à l'accueil de la pseudo-archive