Vous n'êtes pas identifié(e).

#1 Re : Java » [JDBC] Soupçon de fuite memoire » 07/04/2011 10:59:09

Bonjour,

Ce ne pose pas de problème et d'après la mailing list de postgresql-jdbc, il n'est pas obligatoire de fermer un resultset.

En réalité, il n'y a pas de souci, il faut juste être patient et le gc finit par passer.

#2 Java » [JDBC] Soupçon de fuite memoire » 06/04/2011 11:09:16

pierrelm
Réponses : 2

J'ai le code suivant :

public class TestJDBC {


	/** Creation du logger */
	private final static Logger LOGGER = Logger.getLogger(TestJDBC.class);

	private static Timer timer;

	private static Connection connDB;
	private static PreparedStatement sQLStatement;

	public static void main(String[] args) throws SQLException, ClassNotFoundException {

		connexion("jdbc:postgresql://praslin.qual.dc1:5432/G01DPM", "postgres8", "password");
		
		timer = new Timer();
		timer.schedule(new local_task(), 1000L, 1000);	
	}

	static class local_task extends TimerTask {

		public void run() {
			ResultSet rs=null;
			try {
				sQLStatement.setInt(1, 2602);
				rs = sQLStatement.executeQuery();
				LOGGER.debug(sQLStatement.toString());
				sQLStatement.setInt(1, 2604);
				rs = sQLStatement.executeQuery();
				LOGGER.debug(sQLStatement.toString());
				sQLStatement.setInt(1, 2605);
				rs = sQLStatement.executeQuery();
				LOGGER.debug(sQLStatement.toString());
			} catch (SQLException e) {
				LOGGER.error(e,e);
			}
			finally{

				try {
					if(rs!=null)
						rs.close();
				} catch (SQLException e) {
					LOGGER.error(e,e);
				}
				rollBack();
			}
		}
	}

	public static void connexion(String chemin, String user, String password) throws SQLException, ClassNotFoundException
	{
		LOGGER.info("Connexion a la BDD");
		Class.forName("org.postgresql.Driver");
		String url = chemin+"?user="+user+"&password="+password;

		//	Connexion
		connDB = DriverManager.getConnection(url);
		connDB.setAutoCommit(false);
		initPreparedStatement();
	}

	private static void initPreparedStatement() throws SQLException
	{
		sQLStatement = connDB.prepareStatement("select f_transite(?,'FPL','225',9,'test','','')");
	}

	public static void rollBack()
	{
		try
		{
			connDB.rollback();
		}
		catch(SQLException ex)
		{
			LOGGER.error("Erreur lors du rollback ",ex);
		}
	}
}

Avec le profiler d'eclipse, le nombre d'instances actives de org.postgresql.jdbc3.Jdbc3ResultSet augmente sans jamais redescendre.

La procédure stockée appelée f_transite réalise des updates et des insert. Si nécessaire, je peux donner plus d'indications.

Librairie utilisée : postgresql-9.0-801.jdbc3.jar
Java 6

Qu'en pensez-vous ? Erreur dans mon code ? Fuite mémoire ?

#3 Re : Optimisation » Colonne ordonnée » 21/03/2011 15:05:21

Bonjour,
Merci pour votre longue réponse. Nous allons utiliser un index :
CREATE INDEX date_dun_horodatage_fk
  ON horodatage
  USING btree
  (substr(date::text, 1, 10));

Une recherche par dichotomie sur 50 000 000 éléments est réalisée en 25 itérations, donc très rapide. Mais un mécanisme équivalent existe sur les index.

Pour le problème de la date enregistrée sous un format texte, c'est historique de la conception initiale de la base et cela nous pose régulièrement des soucis.

#4 Optimisation » Colonne ordonnée » 18/03/2011 17:40:28

pierrelm
Réponses : 2

Bonjour,
J'ai la table suivante :
CREATE TABLE evt
(
  evt_id numeric(10,0) NOT NULL,
  date_creation character varying(23) NOT NULL, -- Date de creation de l'evenement au format 'yyyy/mm/dd hh24:mi:ss:ccc'
  CONSTRAINT pk_evt PRIMARY KEY (evt_id)
)

On insère des lignes au fur et à mesure avec à chaque fois now() pour la colonne date_creation. Ce qui conduit à ce que la colonne date_creation soit ordonnée (Soient evt_id1 et evt_id2, si evt_id1<evtid2 alors date_creation1<=date_creation2). Le moteur postgresql, pour rechercher une date, ne devrait plus faire un seqscan mais une recherche dichotomique.

Mes 2 questions :
* comment indiquer au moteur postgres que la colonne est ordonnée ?
* serait-ce beaucoup plus performant qu'un index sur la colonne date_creation ou sur un substring de date_creation (seulement yyyy/mm/dd) ?

Pied de page des forums

Propulsé par FluxBB