Translate

jueves, 12 de abril de 2018

Y si , ya se esta hablando de Java 11...


Java 10 no pudo traer otra cosa que los rumores de lo que se viene en java 11.

Primera noticia es que CORBA, Java EE, and JavaFX, ya no tendrán soporte en esta versión. Java 11 también está configurado para perder algunas capacidades mediante la eliminación de los módulos CORBA y Java EE (recientemente renombrado Jakarta EE), así como la eliminación de JavaFX.

Y las nuevas características planificadas incluyen:

  • Epsilon como Java garbage collector , Epsilon manejará la asignación de memoria sin implementar ningún mecanismo de recuperación de memoria. 
  • Una  nueva sintaxis de variable local para parámetros lambda, dado que se debe alinear la sintaxis de una declaración de parámetro formal en una expresión implícitamente tipada con la sintaxis de una declaración de variable local. Esto permitiría usar var cuando se declaran parámetros formales de una expresión lambda implícitamente tipada.
  • El formato de archivo de clase Java se ampliará para soportar un nuevo de grupo constantes, CONSTANT_Dynamic. El objetivo es reducir el costo y la interrupción del desarrollo de nuevas formas de restricciones de archivos de clase materializables.

Como conclusión podemos afirmar que no va ha ver ningún gran cambio en Java 11, solo unos cambios que permitirán mejorar el desempeño del ecosistema java.

Dejo link:
https://www.javaworld.com/article/3266372/core-java/java-11-roadmap-the-new-features-you-can-expect.html

miércoles, 11 de abril de 2018

Tipo de Variables compartidas en Spark



Spark provee 2 tipos de variables compartidas para hacer más eficiente correr spark en un cluster. Hay variables broadcasts y accumutators.

La variable broadcasts, permite a los desarrolladores tener las variables de solo lectura almacenadas en caché en cada máquina en local. Se pueden usar para dar más eficientemente copias de conjuntos de datos de entrada grande a los nodos en el clúster.

Variable accumutators, usan una operación asociativa y, por lo tanto, pueden ser soportados de manera eficiente en paralelo. Se pueden usar para implementar contadores (como en MapReduce) o sumas. Las tareas que se ejecutan en el clúster pueden agregarse a una variable de acumulador mediante el método de agregar. Sin embargo, no pueden leer su valor. Solo el programa del controlador puede leer el valor del acumulador.

martes, 10 de abril de 2018

Entendiendo EXPLAIN PLAN de Oracle


Dado que SQL es un lenguaje declarativo, nosotros no le decimos como hacer las cosas, solo le decimos que hacer. Por lo tanto el motor de base de datos, decide que camino tomar.

Si tenemos un problema de performace en alguna consulta, lo que podemos hacer es pedirle a oracle que nos explique que esta haciendo, y de esta manera ver si le falta un indice o si la podemos ayudar.

La instrucción EXPLAIN PLAN muestra los planes de ejecución elegidos por el optimizador de Oracle para las instrucciones SELECT, UPDATE, INSERT y DELETE. El plan de ejecución de una declaración es la secuencia de operaciones que Oracle realiza para ejecutar la instrucción.

Muestra la siguiente información:
  • Un orden de las tablas a las que hace referencia la consulta o update
  • Un método de acceso para cada tabla mencionada en la consulta o update
  • Un método de combinación para tablas afectadas por operaciones de combinación de la instrucción.
  • Operaciones de datos como filtro, clasificación o agregación
Además la tabla de plan contiene información sobre lo siguiente:
  • Optimización, como el costo y la cardinalidad de cada operación
  • Particionamiento, como el conjunto de particiones accedidas
  • Ejecución paralela
Los resultados de EXPLAIN PLAN le permiten determinar si el optimizador selecciona un plan de ejecución particular, como por ejemplo, bucles anidados. También nos ayuda a comprender las decisiones del optimizador, como por qué el optimizador eligió una unión de bucles anidados en lugar de una combinación de hash, y le permite comprender el rendimiento de una consulta.

Para ejecutar el EXPLAIN PLAN debemos ejecutar por ejemplo esta query:

EXPLAIN PLAN FOR
  SELECT last_name FROM employees;
En este caso se escribio el plan de ejecución en una vista por lo que si queremos verlo, podemos hacer: 

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Luego podemos escribir otros post que nos enseñen como entender los query plans. Pero eso es todo por ahora. 




sábado, 7 de abril de 2018

Problema de database locking usando hibernate

Tuve un problema de database locking (loqueo en una búsqueda de castellanización) en la aplicación que estoy trabajando, el tema era que nadie debería escribir en la tabla que se loqueaba.

Lo primero que hice es ver el log de hibernate y pedirle que me muestre el sql, eso se logra cambiando el parámetro "show_sql". Analizando los sql, cuando se consultaba esta entidad hibernate hacia unos update y deletes que eran rarísimos, porque solo era una consulta. Es decir no debía hacer eso.

Luego de un analisis del codigo de consulta no encontre nada raro... Por lo tanto me puse a ver el mapeo y tampoco, nada raro...

Luego de caer en un pozo depresivo, vi la luz. Al parecer esta entidad estaba contenida por otra entidad, la cual en el método get ordenaba la lista. Parece ilógico, pero no lo es.

Cuando se hacia un get de esta lista, la aplicación ordenaba la lista y hibernate asumia que esta lista había cambiado, claro el no sabe que ya se había guardado ordenada. Por lo tanto cada vez que se hacia un get, hibernate removía la lista vieja y guardaba una nueva, sin importar si había cambios o no.

No se si esto se arreglo en futuras versiones de hibernate, pero como linea general traten siempre que usen hibernate que los métodos get no hagan nada (solo lo que deben hacer, retornar el valor)

Como lo solucione? muy fácil, hice un método get que no ordenaba, es decir el típico get y hice otro método getSorted que lo use en mi código. Y listo!

Espero que les sirva. 

viernes, 6 de abril de 2018

Libros gratuitos

Me llegaron ests libros de java geeks :

Get schooled by Java Code Geeks

Download Dev Guides!

 
Microsoft Azure is now more than seven years old. Like all seven-year-olds, Azure has been through some memorable teething troubles over the years, as well as some incredible growth and change. Microsoft still faces some significant challenges in increasing the adoption of its Azure platform. As Azure continues to evolve to meet the needs of modern app development processes and systems, developers will need to stay up to date with the latest changes in order to keep using the platform as efficiently as possible. In this eBook, we’ll look back at the history of Microsoft Azure and you’ll learn how to stay up to speed with Microsoft’s latest updates to Azure. You’ll also learn about the effect of the recent .NET Core release, as well as new considerations for app developers working with Azure and new ways they can use the platform to facilitate their app development processes. Finally, we’ll take a look at what’s new with Azure, exploring the innovations that could change the way developers work across platforms, both on-premises and in the cloud.
 
 
The primary intended audience for this document is any expert in professional services who needs to assure the health of SharePoint and systems connected to it. If you’re a systems architect, you can gain understanding of SharePoint components and how other applications can take advantage of SharePoint. If you’re an independent consultant, you’ll learn about the elements of comprehensive coverage and total visibility into operations with prebuilt monitoring configurations. Everything in this eBook is based on real-world examples and configurations where AppDynamics was deployed to monitor SharePoint. There’s no private or identifying information here, but it is not designed for the average SharePoint user. The level of detail can be overwhelming and not very useful for non-technical colleagues. This book can be used to help guide users through specific problems, but make sure that you work through those issues first and do not confuse the user with topics that take more specialized technical knowledge and experience.
 
 
IntelliJ IDEA is a Java integrated development environment (IDE) for developing computer software. It is developed by JetBrains, and is available as an Apache 2 Licensed community edition, and in a proprietary commercial edition. The IDE provides for integration with build/packaging tools like grunt, bower, gradle, and SBT. It supports version control systems like GIT, Mercurial, Perforce, and SVN. Databases like Microsoft SQL Server, ORACLE, PostgreSQL, and MySQL can be accessed directly from the IDE. IntelliJ supports plugins through which one can add additional functionality to the IDE. One can download and install plugins either from IntelliJ’s repository website or through IDE’s inbuilt plugin install feature. 
 
 
Hibernate ORM (Hibernate in short) is an object-relational mapping framework, facilitating the conversion of an object-oriented domain model to a traditional relational database. Hibernate solves the object-relational impedance mismatch problems by replacing direct persistence-related database accesses with high-level object handling functions. Hibernate is one of the most popular Java frameworks out there. For this reason we have provided an abundance of tutorials here at Java Code Geeks, most of which can be found here. Now, we wanted to create a standalone, reference post to provide a framework on how to work with Hibernate and help you quickly kick-start your Hibernate applications. Enjoy!
 

miércoles, 4 de abril de 2018

Spark web console


Cuando corres spark en cualquier modo, se pueden ver los jobs y otras estadísticas en la consola web que se encuentra en : localhost:4040

Esta consola tiene los siguientes tabs: Jobs, Stages, Storage, Environment y Executors.

lunes, 2 de abril de 2018

Ur, un lenguaje funcional puro

Ur es un lenguaje de programación similar a ML y Haskell, pero presenta un sistema de tipos significativamente más rico. Ur es funcional puro, estáticamente tipado y estricto. Ur soporta metaprogramación basada en el sitema de row types.

Ur/Web es Ur más una biblioteca estándar especial y reglas asociadas para el análisis sintáctico y la optimización web. Ur/Web admite la construcción de aplicaciones web dinámicas respaldadas por bases de datos SQL. Ur/Web utiliza el tipado estatioco de tal manera que las paginas generadas no pueden :

  • Sufrir cualquier tipo de ataque de inyección de código
  • Retornar HTML no válido
  • Contiener enlaces muertos o invalidos dentro de la aplicación
  • Tener desajustes entre formularios HTML y los campos esperados por sus controladores
  • Incluir el código del lado del cliente que hace suposiciones incorrectas sobre los servicios de estilo "AJAX" que proporciona el servidor web remoto
  • Intentar consultas SQL no válidas
  • Usar referencias o bases de datos impropias en la comunicación con bases de datos SQL o entre navegadores y servidores web


Este tipo de seguridad es solo la base de la metodología Ur/Web. También es posible usar la metaprogramación para construir piezas de aplicación significativas mediante el análisis de la estructura de tipos. Por ejemplo, la demostración incluye un functor estilo ML para construir una interfaz de administración para una tabla SQL arbitraria. El sistema de tipo garantiza que la sub-aplicación de interfaz siempre estará libre de los errores mencionados anteriormente, sin importar qué descripción de tabla bien tipada.

El compilador de Ur/Web también produce código de objeto muy eficiente que no utiliza la recolección de elementos no utilizados. Estos programas compilados a menudo serán incluso más eficientes de lo que la mayoría de los programadores se tomarían la molestia de escribir en C. Por ejemplo, el servidor web independiente generado para la demostración utiliza menos memoria RAM que el shell bash. El compilador también genera versiones JavaScript del código del lado del cliente, sin necesidad de escribir esas partes de las aplicaciones en un lenguaje diferente.

Y como esto furra poco la implementación de todo esto es de código abierto.

Dejo link: http://www.impredicative.com/ur/

jueves, 29 de marzo de 2018

Como instalar y correr Apache Spark?


Hay varias formas diferentes de instalar y usar Spark. Podemos instalarlo en una máquina como una aplicación stand-alone o usar una de las imágenes de máquinas virtuales Spark disponibles de proveedores como Cloudera, Hortonworks o MapR. También podemos usar Spark instalado y configurado en la nube (por ejemplo, en Databricks Community Edition).

Cuando instalamos Spark en una máquina local o usamos una instalación basada en la nube, podemos usar algunos modos diferentes para conectarnos al motor Spark.

La siguiente tabla muestra los parámetros principales de URL para los diferentes modos de ejecutar Spark:

  • Local: Corre Spark de forma local con un worker
  • local[k]: Corre Spark de forma local con k workers (lo ideal es que k sea numero de micros)
  • local[*]: Corre Spark de forma local y corre con un numero de workers que se asigna de forma lógica.
  • spark://HOST:PORT: Conecta con un spark standalone cluster master. El puerto debe ser cualquiera que haya sido configurado en el master. Por defecto es 7077.
  • meso://HOST:PORT: Conecta con un Mesos cluster. E El puerto debe ser cualquiera que haya sido configurado en el master. Por defecto es 5050.
  • yarn-client: conecta con clusters YARD en modo cliente, la ubicación del clúster se encontrará en función de la variable HADOOP_CONF_DIR.
  • yarn-cluster:  conecta con clusters YARD en modo cluster, la ubicación del clúster se encontrará en función de la variable HADOOP_CONF_DIR.


Una vez que Spark este funcionando, nosotros podemos connectar usando Spark shell para analisis interactivo de datos. El shell Spark está disponible en los lenguajes Scala y Python. Java no era compatible con un shell interactivo anteriormente, pero está disponible en JDK 9. La herramienta REPL (read-eval-print loop) en Java se llama Jshell.

Se puede utilizar spark-shell para Scala y pyspark para Python.


sábado, 24 de marzo de 2018

Java 10 fue liberado


Si! vamos por java 10,  oracle tomo el control de java y no para de sacar versiones. Esta versión fue 6 meses despues de java 9.

El lanzamiento de Java 10 vuelve obsoleto a Java 9 y no se ofrecerán más versiones gratuitas de Java 9. A partir del 20 de marzo, las únicas versiones de Java con soporte gratuito de Oracle son Java 8 y Java 10. La próxima versión con soporte a largo plazo disponible va ser Java 11, que se lanzará en septiembre de 2018.

La versión final prácticamente no ha cambiado desde el candidato RC1 y no se han agregado características significativas.

La documentación completa de esta versión está disponible, así como el release note.

Entre las características más importantes se encuentra la palabra "var" que permite la inferencia de tipos:

var foo = new ArrayList<String>();

Además de los casos simples, esto realmente permite construcciones de programación que no eran posibles antes:

public class Test {
    public static void main(String[] args) {
        (new Object() {
            public void bar() {
                System.out.println("bar!");
            }
        }).bar();
    }
}

Y gracias a la palabra var y la inferencia de tipos podemos hacer lo siguiente:

var o = new Object() {
    public void bar() {
        System.out.println("bar!");
    }
};

o.bar();

Todavia tengo post sobre java 8 y 9 y oracle lanza Java 10!! En un futuro no muy lejano seguiré escribiendo sobre las nuevas características de java 10.

Dejo link: http://jdk.java.net/10/
https://docs.oracle.com/javase/10/

¿Cómo logra una empresa argentina figurar entre las mejores 100 compañías de outsourcing del mundo?

Como sabrán algunos trabajo en una empresa que se llama hexacta. Esta empresa se encuentra entre las mejores 100 compañías de outsourcing del mundo dado esto la revista digital insider hizo el siguiente reportaje a un socio de hexacta:

http://insiderlatam.com/como-logra-una-empresa-argentina-figurar-entre-las-mejores-100-companias-de-outsourcing-del-mundo

miércoles, 21 de marzo de 2018

Conjuntos de datos distribuidos resistentes en Spark


Conjuntos de datos distribuidos resistentes o Resilient distributed datasets (RDD) esta basado en Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing” (Matei et al 2012) este es el concepto base de Apache Spark.

RDD es como una tabla en una base de datos, la cual puede guardar datos de cualquier tipo. Spark guarda datos en RDD en diferentes particiones.

RDD ayudan a reorganizar los cálculos y a optimizar el procesamiento de datos. También son tolerantes a fallas porque el RDD sabe cómo recrear y volver a calcular los conjuntos de datos.

RDDs son inmutables (podemos ver la programación funcional de scala en este aspecto). Es decir se puede procesar un RDD pero esto retornara un nuevo RDD con el resultado de la transformación.

RDD soporta 2 tipos de acciones:

  • Transformaciones: esto no retorna un valor pero retorna un nuevo RDD. Algunas funciones de transformación:  map , filter , flatMap , groupByKey , reduceByKey , aggregateByKey , pipe y coalesce.
  • Acciones: operaciones que retornan un valor. Cuando una acción es llamada los datos son procesados y un valor es retornado. Algunas funciones de acción: reduce , collect , count , first , take , countByKey y foreach.


martes, 20 de marzo de 2018

Cursos Gugler


Como es habitual en el blog, trato de promover los buenos cursos. En este caso quiero aconsejarles los cursos de Gugler.

El Laboratorio de Investigación Gugler de la Facultad de Ciencia y Tecnología (U.A.D.E.R) tiene como Misión: "Promover, capacitar y difundir el uso del Software Libre en la región".

Algo muy importante es que los cursos se pueden hacer presenciales o a distancia.

Acá les dejo más info:




Y el link:
https://inscripciones.gugler.com.ar/
https://www.gugler.com.ar/

domingo, 18 de marzo de 2018

Arquitectura de Apache Spark



Apache Spark esta compuesto por tres componentes:
  • Data store
  • API
  • Framework de gestion de recursos


Data store: Apache Spark utiliza el sistema de archivos de hadoop, es decir utiliza hdfs. Por lo tanto es compatible con almacenamiento de hadoop y framework que utilizan este almacenamiento como hbase, casandra, etc.

API: La API permite crear aplicaciones basadas en Spark, utilizando una interfaz estandar. Spark provee esta API para java, scala, python y R.

Gestion de recursos: Spark puede ser deployado en un servidor stand-alone o sobre una infraestructura distribuida sobre frameworks como Mesos o YARD


Ecosistema Spark



Como hemos dicho anteriormente un ecosistema big data cuenta normalmente con varios productos, los cuales proveen diferentes funcionalidades.

En el caso de spark, no es una excepción. Apache Spark incluye: 

Spark Streaming, Se utiliza para procesar información en tiempo real. Esto apoyados en un pequeño sistema micro-batch. A la vez esto usa Dstream que es una serie de RDDs que se procesan en tiempo real. Y para él que no sabe que es RDD (como yo) RDD es Resilient Distributed Dataset  (RDD), la abstracción básica en Spark. Representa una colección de elementos inmutables y divididos que se pueden operar en paralelo.

Spark SQL permite exponer datos de dataset de spark bajo una API Jdbs y permite ejecutar consultas SQL-like con datos de Spark. Tambie permite estraer datos en diferentes formatos.

Spark MLlib : es una librería de maching learning de spark. Esta consiste en los algoritmos comunes de maching learning y utilidades. 

Spark GraphX : Es la API de Grafos y procesamiento de grafos en paralelo. GraphX amplía a Spark RDD al introducir las propiedades de gráfos distribuidos resistente: un multi-grafo dirigido con propiedades asociadas a cada vértice y borde. Para admitir el cálculo de grafos, GraphX expone un conjunto de operadores fundamentales (por ejemplo, subgraph, joinVertices y aggregateMessages) y una variante optimizada de Pregel API. Además, GraphX incluye una creciente colección de algoritmos y constructores de grafos para simplificar el análisis de grafos.

Aparte de estas librerías, hay otros framework que se integran muy bien con Spark:

Alluxio (anteriormente conocido como Tachyon) es un sistema de archivos distribuidos centrado en memoria, que permite compartir archivos de forma segura en un cluster basado en Spark y mapReduce. Este framework cachea un conjunto de datos en memoria, evitando ir a disco a buscar los conjunto de datos frecuentes. Esto permite acelerar el trabajo con Spark.

BlinkDb: es un motor de consulta aproximada para ejecutar consultas SQL interactivas en grandes volúmenes de datos. Permite a los usuarios intercambiar la precisión de la consulta por el tiempo de respuesta. Funciona en grandes conjuntos de datos ejecutando consultas en muestras de datos y presentando resultados con un rango de error significativas. Las versiones posteriores de BlinkDB se mantienen bajo un nuevo proyecto llamado iOLAP.


viernes, 16 de marzo de 2018

Replicas en Oracle 10g con streams parte 2


Continuemos con la captura y replicación de flujos de datos.

En un entorno Streams podemos capturar los eventos de la siguiente manera: Proceso de captura o aplicación personalizada.

Los cambios de objetos de la base son escritos en el area de redologs, dado que ante un error oracle puede volver a una versión consistente y estable. Un proceso de captura es un proceso en segundo plano de Oracle que lee el registro de redolog de la base de datos para capturar los cambios de DML y DDL realizados a los objetos de la base de datos. La base de datos de origen es la base de datos donde se generó el cambio en el registro de redolog. Un proceso de captura formatea estos cambios en mensajes llamados LCR y los envía a una cola. Como un proceso de captura en ejecución captura automáticamente los cambios en función de sus reglas, la captura de cambios mediante un proceso de captura a veces se denomina captura implícita.

Hay dos tipos de LCR: una LCR de fila contiene información sobre un cambio en una fila de una tabla resultante de una operación de DML, y una LCR de DDL contiene información sobre un cambio de DDL en un objeto de base de datos. Se debe utiliza reglas para especificar qué cambios se capturan. Una sola operación DML puede cambiar más de una fila en una tabla. Por lo tanto, una sola operación DML puede generar más de una LCR de fila, y una sola transacción puede consistir en múltiples operaciones DML.

Los cambios son capturados por capture user o usuario de captura, el capture user captura todos los cambios que cumplan con el conjunto de reglas (DML o DDL)

Un proceso de captura de procesos, puede capturar cambios de una base local o de una base remota.

Downstream capture significa que un proceso de captura se ejecuta en una base de datos que no sea la base de datos de origen. Se pueden configurar de la siguiente manera :
  • Una configuración Downstream capture en tiempo real, significa que los servicios de transporte redolog utilizan el log writer process (LGWR) o proceso de escritura de redolog como origen para enviar datos desde el registro de redolog en línea a la base de datos downstream. En la base de datos downstream, un proceso de servidor de archivos remoto (RFS) recibe los datos de redolog y los almacena en el registro de redolog como en espera, y el archivador en la base de datos descendente archiva los datos de redolog en el registro de redolog en espera. El proceso Downstream en tiempo real captura los cambios desde el registro de redolog en espera siempre que sea posible y desde el registro de redolog archivado siempre que sea necesario.

  • Una configuración archived-log downstream capture, significa que los archivos de redolog archivados de la base de datos de origen se copian en la base de datos Downstream. Puede copiar los archivos de redolog archivados en la base de datos downstream utilizando los servicios de transporte de redolog, el paquete DBMS_FILE_TRANSFER, el protocolo de transferencia de archivos (FTP) o algún otro mecanismo.


Un proceso de captura Downstream en tiempo real lee el registro de redolog en espera siempre que sea posible y, de lo contrario, los redologs archivados

La otra manera de capturar datos es con una aplicación personalizada. Esta aplicacion puede capturar los datos desde los logs de transacciones, triggers o otros metodos. La aplicacion debe capturar el cambio y debe convertir este cambio a LCR y luego debe encolar este LCR en la cola de la base destino para hacer esto se pueden utilizar los paquetes DBMS_STREAMS_MESSAGING o DBMS_AQ. La aplicación debe commitiar despues de encolar los LCRs de cada transacción.

Una vez capturados los cambios debemos propagarlos.

En un entorno de replicación de Streams, los procesos de propagacion propagan los cambios capturados. Las propagaciones permiten propagar los LCR origen a las bases de datos destinos.

Las siguientes secciones describen la puesta en escena y la propagación en un entorno de replicación de Streams:
LCR Staging : Los LCR capturados se organizan en un área de preparación. En Streams, el área de preparación es una cola que puede almacenar LCR y DDL LCR, así como otros tipos de mensajes. Los LCR capturados se organizan en una cola, que es la System Global Area (SGA) asciada con una cola.

Los LCR pueden propagarse mediante una propagación o aplicarse mediante un proceso de aplicación, y un LCR Staging  determinado puede propagarse y aplicarse. Una propagación en ejecución propaga automáticamente las LCR basadas en las reglas de sus conjuntos de reglas, y un proceso de aplicación en ejecución aplica LCR automáticamente .

LCR Propagation:En un entorno de replicación de Streams, una propagación normalmente propaga LCR desde una cola en la base de datos local a una cola en una base de datos remota. La cola a partir de la cual se propagan los LCR se denomina cola de origen, y la cola que recibe los LCR se denomina cola de destino. Puede haber una relación de uno a muchos, muchos a uno o muchos a muchos entre las colas de origen y destino.

Incluso después de que un LCR se propaga por una propagación o se aplica mediante un proceso de solicitud, puede permanecer en la cola de origen si también ha configurado Flujos para propagar el LCR a una o más colas diferentes. Además, observe que una cola ANYDATA puede almacenar mensajes de usuario que no sean LCR. Normalmente, los mensajes de usuario que no son de LCR se utilizan para aplicaciones de mensajería, no para la replicación.

Puede configurar un entorno de replicación de Streams para propagar LCR a través de una o más bases de datos intermedias antes de llegar a una base de datos de destino. Tal entorno de propagación se llama red dirigida. Un LCR puede o no ser procesado por un proceso de solicitud en una base de datos intermedia. Las reglas determinan qué LCR se propagan a cada base de datos de destino y puede especificar la ruta que recorrerán los LCR en su camino hacia una base de datos destino.

La ventaja de usar una red dirigida es que una base de datos de origen no necesita tener una conexión de red física con la base de datos de destino. Entonces, si desea que los LCR se propaguen de una base de datos a otra, pero no hay conexión de red directa entre las computadoras que ejecutan estas bases de datos, puede propagar los LCR sin reconfigurar su red, siempre que una o más bases de datos intermedias conecten el base de datos de origen a la base de datos de destino. Si usa redes dirigidas, y un sitio intermedio se apaga durante un período de tiempo prolongado o si se elimina, entonces es posible que necesite reconfigurar la red y el entorno de Streams.

Dejo link: https://docs.oracle.com/cd/B19306_01/server.102/b14228/gen_rep.htm