Guía Tecnológica Caché

Capítulo Segundo:
Servidor de datos multidimensional de Caché

La base de datos de alto rendimiento de Caché utiliza un motor de datos multidimensional que permite el almacenamiento eficaz y compacto de datos en una estructura de datos compleja.  Los objetos y SQL se implementan especificando un diccionario de datos unificado que define las clases y tablas y proporciona un mapeo con las estructuras multidimensionales, mapeo que puede generarse automáticamente.

ACCESO INTEGRADO A BASE DE DATOS

Caché proporciona a los programadores la libertad de almacenar y acceder a los datos mediante acceso a objetos, SQL o acceso directo a las estructuras multidimensionales.  Independientemente del método de acceso, todos los datos de la base de datos de Caché se almacenan en las arrays multidimensionales.

Multidimensional Access
Multidimensional Access

Una vez almacenados los datos, se pueden utilizar simultáneamente los tres métodos de acceso sobre los mismos datos, con concurrencia total.

Una característica única de Caché es su Arquitectura de Datos Unificada.  Siempre que se define una clase de objetos en la base de datos, Caché genera automáticamente una descripción relacional SQL de dicha clase.  De forma similar, cuando se importa en el Diccionario de Datos una descripción DDL de una base de datos relacional, Caché crea automáticamente junto con la descripción relacional, la definición de la clase equivalente, lo que posibilita el acceso inmediato como objetos. Caché mantiene estas descripciones unidas: en la práctica existe una única definición de datos.  El programador puede editar y ver el diccionario tanto desde la perspectiva de objeto como de tabla relacional.

Caché crea automáticamente un mapeo de cómo se almacenan los objetos y tablas en las estructuras multidimensionales, aunque también el programador puede controlar el mapeo explícitamente.

Las ventajas de Caché

Flexibilidad
Los modos de acceso a los datos de Caché (Objetos, SQL y Directo) se pueden utilizar concurrentemente sobre los mismos datos. Esta flexibilidad ofrece a los programadores la libertad de pensar en los datos de la forma que tenga más sentido y utilizar el método de acceso que mejor se adapte a las necesidades de cada programa.

Menos trabajo
La Arquitectura de Datos Unificada de Caché describe automáticamente los datos como objetos y como tablas con una sola definición.  No es necesario codificar las transformaciones, facilitando el desarrollo y mantenimiento de las aplicaciones.

Afianzar los conocimientos y aplicaciones existentes
Los programadores pueden ampliar sus conocimientos relacionales e ir introduciendo capacidades de objeto en aplicaciones existentes a medida que evolucionan.

MODELO DE DATOS MULTIDIMENSIONAL

El núcleo de la base de datos de Caché es un motor de datos multidimensional tremendamente potente.  Los lenguajes de script  integrados en Caché proporcionan acceso directo a las estructuras multidimensionales, ofreciendo el mayor rendimiento y el rango más amplio de posibilidades de almacenamiento, y muchas aplicaciones se implementan en su totalidad utilizando directamente este motor de datos.  El "acceso global" directo se suele utilizar cuando existen estructuras poco comunes y muy especializadas y no hay necesidad de proporcionar acceso mediante objetos o SQL a dichas estructuras, o cuando se necesita el mayor rendimiento posible. 

No existe ningún diccionario de datos, y por tanto ninguna definición de datos, para el motor de datos multidimensional.

Estructura de datos multidimensional compleja
Las arrays multidimensionales de Caché se denominan "globals". Los datos se pueden almacenar en un global con cualquier número de subíndices. Además, los subíndices son independientes y pueden contener cualquier tipo de datos.  Un subíndice podría ser un entero, como 34, mientras que otro podría ser un nombre significativo, como "ArtículosLínea", incluso en el mismo nivel de subíndice.

Por ejemplo, una aplicación de inventario de stock que proporcione información sobre artículo, talla, color y estampado podría tener una estructura como la siguiente:
            ^Stock(artículo,talla,color,estampado) = cantidad
Algunos datos de ejemplo:
            ^Stock("vestido",4,"azul","floral")=3

Con esta estructura es muy sencillo determinar si hay vestidos azules de la talla 4 con estampado floral, simplemente accediendo a ese nodo de datos.  Si un cliente desea un vestido de la talla 4 pero no está seguro del color y del estampado, es fácil mostrar una lista de todos ellos pasando por todos los nodos de datos bajo
 ^Stock("vestido",4).

En este ejemplo, todos los nodos de datos eran de naturaleza similar, (almacenaban una cantidad) y todos se almacenaban en el mismo nivel de subíndice (4 subíndices) con subíndices similares (el tercer subíndice siempre era texto que representaba un color). Sin embargo, no tiene porqué ser similar. No todos los nodos de datos tienen que tener el mismo número o tipo de subíndices, y pueden contener distintos tipos de datos.
 
A continuación viene un ejemplo de un global más complejo con datos de una factura que tiene distintos tipos de datos almacenados en distintos niveles de subíndices:

            ^Factura(nº factura,"Cliente") = información del cliente­
            ^Factura(nº factura,"Fecha") = fecha factura
            ^Factura(nº factura,"Artículos") = nº de artículos de la factura
            ^Factura(nº factura,"Artículos",1,"Serie") = número de serie del primer artículo
            ^Factura(nº factura,"Artículos",1,"Cantidad") = cantidad del primer artículo
            ^Factura(nº factura,"Artículos",1,"Precio") = precio del primer artículo
            ^Factura(nº factura,"Artículos",2,"Serie") = número de serie del segundo artículo
            etc.

Múltiples elementos de datos por nodo

Multiple Data Elements per NodeCon frecuencia, un solo elemento de datos se almacena en un nodo de datos, como una fecha o una cantidad, pero algunas veces resulta útil almacenar múltiples elementos de datos juntos en un solo nodo de datos.  Esto es particularmente útil cuando existe un conjunto de datos relacionados a los que se accede en grupo con frecuencia.  Esto también puede mejorar el rendimiento al necesitar menos accesos a la base de datos.

Por ejemplo, en la factura anterior cada artículo incluía el número de serie, la cantidad y el precio, todos ellos como nodos separados, pero se podrían almacenar como una lista de elementos en un solo nodo:
^Factura(nº factura,"ArtículosLínea",nº artículo).

Para simplificar esto, Caché dispone de la función $list(), que puede agrupar varios elementos de datos en una cadena de bytes de longitud delimitada y más tarde desagruparlos conservando el tipo de datos.

El bloqueo lógico favorece la alta concurrencia

En sistemas con miles de usuarios, la reducción de conflictos entre procesos concurrentes es crítica para conseguir alto rendimiento.  Uno de los mayores conflictos se da entre transacciones que intentan acceder a los mismos datos.

Los procesos de Caché no bloquean páginas enteras de datos al ejecutar actualizaciones. En su lugar, dado que las transacciones requieren acceso frecuente o cambios a pequeñas cantidades de datos, en Caché el bloqueo de la base de datos se realiza a nivel lógico. Los conflictos de la base de datos se reducen aún más utilizando operaciones individuales de suma y resta, que no requieren bloqueo. (Estas operaciones resultan especialmente útiles en los contadores incrementales utilizados para asignar números de id y para modificar contadores estadísticos).

Con Caché, las transacciones individuales se ejecutan más rápidamente, y se pueden ejecutar más transacciones simultáneamente.

Datos de longitud variable en sparse arrays

Como los datos de Caché tienen de forma inherente una longitud variable, y se almacenan en sparse arrays, Caché suele necesitar menos de la mitad del espacio que necesita una base de datos relacional. Además de reducir los requerimientos de disco, el almacenamiento de datos compacto mejora el rendimiento porque se pueden leer y escribir más datos con una sola operación de E/S, y los datos se pueden almacenar en memoria intermedia cache de forma más eficiente.

Las declaraciones y definiciones no son necesarias

Las arrays multidimensionales de Caché son inherentemente independientes de los tipos, tanto en los datos en sí  como en los subíndices.  Las declaraciones, definiciones o asignaciones de almacenamiento no son necesarias.  Los datos globales simplemente empiezan a existir desde que son insertados.

Namespaces

En Caché, los datos y el código se almacenan en ficheros de disco con el nombre CACHE.DAT (sólo uno por directorio). Cada fichero contiene numerosos globals (arrays multidimensionales). En un fichero, el nombre de cada global debe ser único, pero fi cheros diferentes pueden contener el mismo nombre de global. Sin mucho rigor, se pueden considerar estos ficheros como bases de datos.

En lugar de especificar qué fichero de base de datos utilizar, cada proceso de Caché utiliza un namespace para acceder a los datos. Un namespace es un mapa lógico que mapea los nombres de las arrays multidimensionales globales y el código con las bases de datos. Si se mueve una base de datos de una unidad de disco u ordenador a otro, sólo es necesario actualizar el mapeo del namespace. La propia aplicación no cambia.

Normalmente, aparte de algo de información del sistema, todos los datos de un namespace se almacenanen una sola base de datos. Sin embargo, los namespaces proporcionan una estructura flexible que permite mapeos arbitrarios, y no es extraño que un namespace mapee el contenido de varias bases de datos, pudiendo incluir algunas situadas en otros ordenadores.

.

Las ventajas de Caché

Rendimiento
Utilizando un modelo de datos multidimensional eficaz con técnicas de almacenamiento mediante Sparse Arrays en lugar de un laberinto inmanejable de tablas bidimensionales, el acceso a los datos y las actualizaciones se realizan con menos operaciones E/S en disco. La E/S reducida significa que las aplicaciones se ejecutarán más rápidamente.  

Escalabilidad
El modelo de datos multidimensional transaccional permite a las aplicaciones basadas en Caché escalarse a muchos miles de usuarios sin sacrificar el alto rendimiento. Esto se debe a que el acceso a los datos de un modelo multidimensional no se ve afectado de forma significativa por el tamaño o la complejidad de la base de datos, si lo comparamos con los modelos relacionales. Las transacciones acceden a los datos que necesitan sin realizar complicados "joins" o hacer operaciones de tabla en tabla.

El uso del bloqueo lógico en Caché para las actualizaciones en lugar de bloquear las páginas físicas contribuye también de forma importante a la concurrencia, como lo es su sofisticado almacenamiento de datos en memoria intermedia cache a través de las redes.

Desarrollo rápido
Caché permite desarrollar más rápidamente porque la estructura de datos proporciona un almacenamiento natural y de fácil comprensión de datos complejos y no requiere gran cantidad de declaraciones ni definiciones largas o complicadas. El acceso directo a los globales es muy sencillo, lo que permite utilizar la misma sintaxis de lenguaje que para acceder a las arrays locales.

Rentabilidad
Comparadas con las aplicaciones relacionales de tamaño similar, las aplicaciones basadas en Caché requieren mucho menos hardware y ningún administrador de bases de datos. La gestión y utilización del sistema son sencillas.


ACCESO SQL

SQL es el lenguaje de consulta de Caché y soporta un conjunto completo de funcionalidades de bases de datos relacionales, incluyendo DLL, transacciones, integridad referencial, triggers, procedimientos almacenados y mucho más. Caché soporta acceso mediante ODBC y JDBC (utilizando un controlador basado en Java puro).  Los comandos y consultas SQL también pueden embeberse en Caché ObjectScript y dentro de métodos de objeto. 

SQL accede a los datos representados como tablas con filas y columnas.  Dado que los datos de Caché se almacenan realmente en eficientes estructuras multidimensionales, las aplicaciones que utilizan SQL obtienen un mejor rendimiento con Caché que cuando se ejecutaban sobre bases de datos relacionales tradicionales.  El rendimiento resulta evidente, tanto con las consultas ya  compiladas y altamente eficaces como con la ejecución de sentencias SQL dinámicas (definidas en tiempo de ejecución).

Caché soporta, además de la sintaxis SQL estándar, muchas de las extensiones utilizadas habitualmente en otras bases de datos por lo que muchas aplicaciones basadas en SQL pueden ejecutarse en Caché sin realizar cambios, especialmente aquellas escritas con herramientas independientes de la base de datos. Sin embargo, los procedimientos almacenados específicos de proveedores necesitarán algo de trabajo e InterSystems tiene traductores para facilitar ese trabajo. 

Caché SQL incluye mejoras de objetos que hacen que el código SQL sea más sencillo y más intuitivo de leer y escribir.

Traditional SQL

SELECT
CV.NombCompleto, MV.Descr, VP.Valor, AV.FechaFac, AV.NumFac
FROM
VentasPrinc VP, ArtVenta AV, ProdVenta PV, ClienteVenta CV, MercadoVenta MV
WHERE
AV.IDArtVenta *= VP.ArtVenta
AND PV.IDProdVenta *= VP.Producto
AND CV.IDClienteVenta *= VP.Cliente
AND MV.IDMercadoVenta *= CV.MercadoVenta
AND PV.Descr = ‘Martillo’

Object Extended SQL

SELECT
Cliente->NombCompleto,
Cliente->MercadoVenta->Descr, Valor,
ArtVenta->FechaFac, ArtVenta->NumFac
FROM VentasPrinc
WHERE Producto->Descr = ‘Martillo’


Relational Gateway
Relational Gateway

Acceso a bases de datos relacionales con Caché Relational Gateway

Caché Relational Gateway permite que una solicitud SQL que se origine en Caché se envíe a otras bases de datos (relacionales) para  su proceso. Utilizando Gateway, una aplicación de Caché puede recuperar y actualizar datos almacenados en la mayoría de las bases de datos relacionales.
 
Además, si se compilan las clases de bases de datos de Caché con la opción CachéSQLStorage, Gateway permite a las aplicaciones de Caché utilizar bases de datos relacionales de forma transparente. Sin embargo, las aplicaciones se ejecutarán más rápidamente y serán más escalables si acceden a la base de datos post-relacional de Caché.

 

Las ventajas de Caché

SQL más rápido
Las aplicaciones relacionales pueden disfrutar de un rendimiento significativamente mayor utilizando Caché SQL para conectar con la eficiente base de datos post-relacional de Caché.

Desarrollo más rápido
En Caché, las consultas SQL pueden escribirse de forma más intuitiva, utilizando menos líneas de código.

Compatibilidad con las aplicaciones y generadores de informes existentes
Los controladores ODBC y JDBC nativos de Caché proporcionan interoperatividad de alto rendimiento con aplicaciones convencionales, incluyendo muchas de las herramientas de análisis de datos y generación de informes más conocidas.

CACHE OBJECTS

El modelo de objetos de Caché se basa en el estándar ODMG.  Caché soporta un conjunto completo de conceptos de programación orientada a objetos, incluyendo la encapsulación, los objetos embebidos, la herencia múltiple, el polimorfismo y las colecciones.

Los lenguajes de script integrados en Caché manipulan directamente estos objetos y Caché también expone las clases de Caché como clases de Java, EJB, COM, .NET y C++.  Las clases de Caché también pueden habilitarse automáticamente para soportar XML y SOAP simplemente pulsando un botón en Studio IDE.  De esta forma, los objetos de Caché están disponibles inmediatamente para cualquier tecnología de objetos de uso común.

Un programa externo al Servidor de Aplicaciones de Caché puede acceder de varias formas a las clases Caché:

  1. Cualquier clase Caché se puede proyectar como una clase del lenguaje nativo. Cuando un programa de Java, C++, C#, Visual Basic o cualquier otro accede a un objeto de Caché, llama a una plantilla de la clase en el lenguaje nativo. Esa clase de plantilla (generada automáticamente por Caché) se comunica con el Servidor de Aplicaciones de Caché para invocar métodos del servidor de Caché y acceder a las propiedades o modificarlas. El estado de los objetos de Caché siempre se mantiene en el Servidor de Aplicaciones de Caché. Para acelerar la ejecución y reducir la cantidad de mensajes, Caché almacena en memoria intermedia caché una copia de los datos del objeto en el cliente y realiza actualizaciones en paralelo con otros mensajes cuando es posible.
  2. Se puede utilizar una proyección “ligera” para clases de bases de datos  en las que la clase de plantilla del lenguaje nativo accede directamente a la base de datos, sin pasar por el Servidor de aplicaciones. El estado del objeto no se mantiene en el Servidor de aplicaciones; las propiedades en la memoria sólo se mantienen en el cliente. Esta solución ofrece un rendimiento considerablemente más alto, pero menor funcionalidad, dado que no se pueden invocar los métodos de instancia del servidor de la clase (es decir, los métodos que necesitan acceso a las propiedades que están en la memoria).
  3. La tecnología Jalapeño de InterSystems permite a los desarrolladores de Java crear en primer lugar clases persistentes Java como cualquier otra clase POJO (“Plain Old Java Objects”) en el IDE de su elección y a continuación hacer que Caché genere automáticamente un esquema de base de datos y la clase Caché correspondiente.  Utilizando esta solución, la clase Java no se modifica y la aplicación sigue accediendo a sus propiedades y métodos. Caché proporciona una clase de biblioteca (“ObjectManager”) con una API que se utiliza para almacenar y recuperar objetos de base de datos y realizar consultas.

Con cada una de estas tres soluciones, el programa del usuario percibe el objeto como local. Caché maneja de forma transparente todas las comunicaciones, utilizando llamadas o TCP.

La plantilla de Java y la biblioteca de soporte están basadas completamente en Java, por lo que pueden utilizarse en la Web o en dispositivos Java especializados.

Generadores de métodos

Caché incluye varias tecnologías de objetos avanzadas exclusivas y una de ellas son los generadores de métodos.  Un generador de métodos es un método que se ejecuta en tiempo de compilación, generando código que puede ejecutarse cuando se ejecuta el programa.  El generador de métodos tiene acceso a las definiciones de clases, incluidas las definiciones de propiedades y métodos, y parámetros, con el fin de permitirle generar un método personalizado para la clase.  Los generadores de métodos son particularmente potentes combinados con la herencia múltiple; funcionalmente pueden definirse en una clase heredada multiplicada que se personaliza a sí misma para la subclase.

 

Las ventajas de Caché

Caché está totalmente preparado para objetos, y proporciona toda la potencia de la tecnología de objetos a los desarrolladores de aplicaciones de proceso transaccional de alto rendimiento.

Desarrollo rápido de aplicaciones
La tecnología de objetos constituye una potente herramienta para aumentar la productividad del programador. Los desarrolladores pueden pensar en objetos (incluso objetos tremendamente complejos) y utilizarlos de forma sencilla y cercana a la realidad, acelerando el proceso de desarrollo de la aplicación. Además, la modularidad e interoperabilidad innata de los objetos simplifican el mantenimiento de la aplicación y permiten al programador aprovechar su trabajo para otros muchos proyectos.


Previous Page

Página anterior

Tabla de Contenidos

Continuación

Next Page