Tengo este código que convierte un Treemap en bytes y almacenarlos en la base de datos (Oracle 11g). Ahora que el almacenamiento parece estar funcionando bien. Quiero recuperar el mapa de ahora, pero es en bytes en el campo blob. ¿Cómo puedo recuperar y re-construir el mapa?

El código para almacenar el mapa es:

 public void StoreMapDB(TreeMap<DateTime, Integer> map) throws
        IOException, FileNotFoundException{

       try {
          Connection con = null;

          Class.forName("oracle.jdbc.driver.OracleDriver");
          con=DriverManager.getConnection(
            "jdbc:oracle:thin:@dsds",
            "dsdsd",
            "XXdsdsX");
          con.setAutoCommit(false);
          ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
          ObjectOutputStream out = new ObjectOutputStream(bos);
          out = new ObjectOutputStream(bos) ;
          out.writeObject(map);
          out.close();

          byte[] buf = bos.toByteArray();
          PreparedStatement prepareStatement = con.prepareStatement("INSERT INTO 
           SMD_DATESTREEMAP VALUES(?,?)");
          prepareStatement.setLong(1, 2);
          prepareStatement.setBinaryStream(2, new ByteArrayInputStream(buf),
           buf.length);
          prepareStatement.executeUpdate();


         //insertMap.executeUpdate();
          con.commit();
    } catch(Exception e){
        System.err.print(e);
    }
}

P. S. he editado este código pero no creo que funciona porque muestra el tamaño de recuperar mapa como 0 donde debe estar 366.

  public TreeMap<DateTime, Integer> retrieveMapDB()throws IOException,
        SQLException{

    try {
        Connection con = null;

        Class.forName("oracle.jdbc.driver.OracleDriver");
        con=DriverManager.getConnection(
            "jdbc:oracle:thin:@oradbfdfdt05:f:fdfd",
            "cxcx",
            "hpdbcxcxsmb");
        con.setAutoCommit(false);
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        String query = "SELECT TREEMAP FROM SMD_DATESTREEMAP WHERE id = ?";
        try {
            pstmt = con.prepareStatement(query);
            int id = 1;
            pstmt.setInt(1, id);

            rs = pstmt.executeQuery();
            while(rs.next()){
                ByteArrayInputStream bos = new 
           ByteArrayInputStream(rs.getBytes("TREEMAP")) ;
                ObjectInputStream out = new ObjectInputStream(bos);
                retrievedmap=(TreeMap<DateTime, Integer>)out.readObject();
            }


        }catch(IOException ioe){
            System.err.print(ioe);
        }
    }catch(ClassNotFoundException cnfe){
        System.err.print(cnfe);
    }
  return retrievedmap;
}
InformationsquelleAutor sys_debug | 2011-12-09

2 Comentarios

  1. 2

    Usted puede obtener InputStream objeto a través de ResultSet.getBinaryStream() método.

    PreparedStatement prepareStatement = con.prepareStatement("select * from SMD_DATESTREEMAP");
    ResultSet rs=prepareStatement.executeQuery();
    
    while(rs.next())
          {
           oracle.jdbc.driver.OracleBlobInputStream bos=(oracle.jdbc.driver.OracleBlobInputStream) rs.getBinaryStream(2) ;
    
           ObjectInputStream out = new ObjectInputStream(bos);
    
           map=(TreeMap<DateTime, Integer>)out.readObject();
           ...
          }

    Puede escribir matriz de bytes en lugar de la secuencia binaria.

          ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
          ObjectOutputStream out = new ObjectOutputStream(bos);
          out.writeObject(map);
          out.flush();
          out.close();
          byte[] buf = bos.toByteArray();
    
          PreparedStatement prepareStatement = con.prepareStatement("INSERT INTO SMD_DATESTREEMAP VALUES(?,?)");
          prepareStatement.setInt(1, 1);
          prepareStatement.setBytes(2, buf);
          prepareStatement.executeUpdate();
          prepareStatement.close();

    y lectura de la matriz de bytes:

         while(rs.next())
          { 
           byte []buf=rs.getBytes(2);
           ByteArrayInputStream bos=new ByteArrayInputStream(buf);
           ObjectInputStream out = new ObjectInputStream(bos);
           map=(TreeMap<DateTime, Integer>)out.readObject();
           ..
           }
    • he probado el de oracle.jdbc.la unidad… pero no funcionó. dice que no se puede acceder fuera del paquete, ya que no la pública?
    • Ok, así que antes de leer tu post, he probado el anterior(pregunta modificado) pero no funcionó. Alguna idea de por qué?
    • ur código para leer el byte de la matriz, si se coloca en el método ofrece java.sql.SQLException: Conjunto De Resultados.siguiente no fue convocado
    • método next() debe ser llamada antes de empezar a leer. Intenta vaciar el ObjectOutputStream antes de que se cierra.
    • Hice que ahora, pero creo que el mapa obtenido se vacía. He probado que con si(mapa.isEmpty()) Sistema.a cabo.println(«Vacío»);
  2. 1

    gracias a AVD para apoyar en gran medida y también esta trabajado más con mi código/pregunta. Así que aquí está la respuesta…BLOB de Oracle

    Y el fragmento de código que trabajó en complemento con AVD de la respuesta, es:

         Blob blob = rs.getBlob("col_blob");
    
        //Get the number bytes in the BLOB
        long blobLength = blob.length();
    
        //Get bytes from the BLOB in a byte array
        int pos = 1;   //position is 1-based
        int len = 10;
        byte[] bytes = blob.getBytes(pos, len);

    Espero que esto sería útil si alguien requieren aclaración, estaré más que Feliz 😀

Dejar respuesta

Please enter your comment!
Please enter your name here