Bonjour a tous,
je travaille sur une application java. J'attaque un serveur Oracle 9i via Java/Jdbc.
Après mettre rendu compte que par défaut Oracle ne retournait que 10, j'ai trouvé un
paramètre magique qui m'a permi d'améliorer grandement le temps de balayage de mon
resultset : defaultRowPrefetch. J'ai donc mis ce parametre dans le oracle-ds.xml de
mon serveur Jboss à 50.
Le prb que je constate est que dans le temps la récupération des 50 tuples devient de
plus en long. Dans le temps la base prends aussi pas mal de volume. D'où ma question
comment faire pour garder un temps de récupération constant en dépit de la taille de la
base qui augmente.
J'utilise le framework Hibernate. Mais pour faire ma requete je récupere une pure
connection JDBC via Hibernate. Un peu de code.
Dans JBoss mon oracle-ds.xml ressemble à ça :
Le code Java ressemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>OracleDS</jndi-name> <connection-url>jdbc:oracle:thin:@<IP>:<PORT>:<SID></connection-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <user-name>seb</user-name> <password>seb</password> <connection-property name="defaultRowPrefetch">50</connection-property> <blocking-timeout-millis>5000</blocking-timeout-millis> <idle-timeout-minutes>15</idle-timeout-minutes> <max-pool-size>20</max-pool-size> <min-pool-size>10</min-pool-size> <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> </local-tx-datasource> </datasources>
Le temps d'exécution de la requete est stable en dépit du volume dans la base. Mais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 // Partie 1) Connection cnx = HibernateCnx.getSession().getConnection(); PreparedStatement ps = cnx.prepareStatement("SELECT * FROM ..."); ps.setString(1, idAuto); ps.setInt(2, cntTacheRetour); ResultSet rs = ps.executeQuery(); rs.setFetchDirection(ResultSet.FETCH_FORWARD); // Partie 2) while (rs.next()) { // Traitement (getter/setter) // Récupération des champs de la requete }
le temps de récupération varie en fonctionne du volume (partie 2). Qui sait quels
sont les paramètres à utiliser pour garder un temps dans cette partie aussi.
Merci (espérant que j'ai été clair)
Balises [Code] rajoutées par Ricky81
Merci d'y penser à l'avenir
Partager