<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    Hola Javier.<br>
    <br>
    Yo pensaba que lo del absolutePosition funcionaba, aunque s&iacute; es
    cierto que a veces ha dado problemas. Imagino que antes de usar el
    recordset llamas al m&eacute;todo start() y al final al m&eacute;todo stop()....
    (por si acaso).<br>
    <br>
    En cualquier caso, si cierras y vuelves a crear el statement, lo veo
    bien. No creo que sea lento, y en cualquier caso dudo que se note.<br>
    Lo de cerrar los cursores binarios, recuerdo que lo intent&eacute;, pero
    fallaba m&aacute;s por que el cursor ya no era v&aacute;lido que porque se quedara
    abierto. Al cerrar la sesi&oacute;n, los cursores binarios se cierran
    autom&aacute;ticamente, as&iacute; que opt&eacute; por dejarlo abierto.<br>
    <br>
    Si con lo que has hecho ya no aparecen errores, enhorabuena, creo
    que habr&aacute;s resuelto uno de los bugs m&aacute;s escondidos!! :-)<br>
    <br>
    Saludos, y pruebalo bien, a ver si para la 1.11 lo podemos meter en
    el trunk.<br>
    <br>
    Fran.<br>
    <br>
    El 21/10/2010 16:50, Javier Est&eacute;vez escribi&oacute;:
    <blockquote
      cite="mid:AANLkTimfPhy1T93aAygScBB_tEENnmf+muqHRg=AVj4J@mail.gmail.com"
      type="cite">Hola.<br>
      <br>
      Trabajando en el desarrollo de una extensi&oacute;n me he encontrado con
      un problema al recuperar datos de una capa de PostGIS de m&aacute;s de
      30000 elementos. Mi extensi&oacute;n recupera el valor de un campo
      concreto de la tabla en una fila dada, para lo que uso un c&oacute;digo
      que ya hab&iacute;a utilizado en m&uacute;ltiples otras ocasiones sin ning&uacute;n
      problema:<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; idx = recordset.getFieldIndexByName(fieldName);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (idx &gt; -1) {<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Value val =
      recordset.getFieldValue(rowPosition, idx);<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....<br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
      <br>
      Mientras la fila en cuesti&oacute;n est&eacute; entre las primeras 5000 no hay
      ning&uacute;n problema, pero a partir de ah&iacute; empiezan a surgir errores al
      obtener el dato a trav&eacute;s de getFieldValue, concretamente en la
      funci&oacute;n setAbsolutePosition, en la clase PostGisDriver de extJDBC.
      Tras indagaciones en el driver de PostGIS he podido comprobar que
      se da cuando el dato solicitado no se encuentra en el cursor que
      se est&aacute; utilizando actualmente para obtener los datos en formato
      binario y de forma m&aacute;s &aacute;gil, concretamente al tratar de crear un
      nuevo cursor para obtener los datos.<br>
      <br>
      Descubr&iacute; que los cursores se generan en dos puntos del c&oacute;digo: en
      setData (para los primeros 5000 elementos) y en la mencionada
      setAbsolutePosition (para el resto):<br>
      <br>
      En setData: <br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st =
((ConnectionJDBC)conn).getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet.CONCUR_READ_ONLY);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // st.setFetchSize(FETCH_SIZE);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myCursorId++;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st.execute("declare " + getTableName() + myCursorId +
      "_wkb_cursor binary scroll cursor with hold for " + sqlAux);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs = st.executeQuery("fetch forward " + FETCH_SIZE<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " in " + getTableName() + myCursorId +
      "_wkb_cursor");<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fetch_min = 0;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fetch_max = FETCH_SIZE - 1;<br>
      <br>
      Donde las variables son atributos de la clase: st es un Statement,
      rs es un ResultSet y fech_min, fech_max y myCursorId son enteros.<br>
      <br>
      En setAbsolutePosition se utilizan esos mismos atributos:<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // calculamos el intervalo correcto<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fetch_min = (index / FETCH_SIZE) * FETCH_SIZE;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fetch_max = fetch_min +&nbsp; FETCH_SIZE - 1;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // y cogemos ese cacho<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs.close();<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myCursorId++;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st.execute("declare " + getTableName() + myCursorId +
      "_wkb_cursorAbsolutePosition binary scroll cursor with hold for "
      + sqlTotal);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st.executeQuery("fetch absolute " + fetch_min<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " in " + getTableName() + myCursorId +
      "_wkb_cursorAbsolutePosition");<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs = st.executeQuery("fetch forward " + FETCH_SIZE<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + " in " + getTableName() + myCursorId +
      "_wkb_cursorAbsolutePosition");<br>
      <br>
      <br>
      Al utilizar la misma variable de tipo Statement en toda la clase,
      me inclino a pensar que en alguna parte se ha inutilizado por
      cualquier motivo, por lo que he probado a reiniciarlo en
      setAbsolutePosition, metiendo la siguientes l&iacute;neas (marcadas con
      *) despu&eacute;s del cierre del ResultSet:<br>
      <br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ...<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rs.close();<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st.close(); *<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st =
((ConnectionJDBC)conn).getConnection().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet.CONCUR_READ_ONLY); *<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; myCursorId++;<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; st.execute("declare " + getTableName() + myCursorId +
      "_wkb_cursorAbsolutePosition binary scroll cursor with hold for "
      + sqlTotal);<br>
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ...<br>
      <br clear="all">
      Y as&iacute; parece funcionar perfectamente. Pero como no s&eacute; muy bien qu&eacute;
      consecuencias tiene esto, planteo las siguientes preguntas:<br>
      <br>
      - &iquest;Puede existir alg&uacute;n problema de sincron&iacute;a con los datos de la
      BD?<br>
      - &iquest;Es excesivamente ineficiente?<br>
      - &iquest;Por qu&eacute; se utiliza una &uacute;nica variable de tipo ResultSet y
      Statement para (casi) todo?<br>
      - Si cuando hay cambio de cursor se desecha el anterior para no
      volverlo a utilizar, &iquest;no se deber&iacute;a cerrar (sentencia SQL CLOSE)?
      <br>
      <br>
      No s&eacute; si me he liado demasiado al tratar de contar el tema. Espero
      que pod&aacute;is arrojar un poco de luz a todo este l&iacute;o que me he
      montado yo solo...<br>
      <br>
      Un saludo.<br>
      <br>
      <br>
      -- <br>
      Javier Est&eacute;vez Vali&ntilde;as<br>
      Grupo de Desarrollo<br>
      Cartolab - Laboratorio de Ingenier&iacute;a Cartogr&aacute;fica<br>
      <a moz-do-not-send="true" href="http://www.cartolab.es">http://www.cartolab.es</a><br>
      <br>
      ETS Ingenier&iacute;a de Caminos, Canales y Puertos<br>
      Universidade da Coru&ntilde;a<br>
      Campus de Elvi&ntilde;a - 15071 A Coru&ntilde;a (Espa&ntilde;a)<br>
      (34)981167000 ext. 5493<br>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
gvSIG_desarrolladores mailing list
<a class="moz-txt-link-abbreviated" href="mailto:gvSIG_desarrolladores@listserv.gva.es">gvSIG_desarrolladores@listserv.gva.es</a>
<a class="moz-txt-link-freetext" href="http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores">http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores</a>
</pre>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Fran Pe&ntilde;arrubia
Scolab
<a class="moz-txt-link-abbreviated" href="http://www.scolab.es">www.scolab.es</a>

Asociaci&oacute;n gvSIG
<a class="moz-txt-link-abbreviated" href="http://www.gvsig.com">www.gvsig.com</a>
</pre>
  </body>
</html>