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.
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
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 Menos trabajo Afianzar los conocimientos y aplicaciones existentes |
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
Con 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 Escalabilidad 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 Rentabilidad |
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 | Object Extended SQL SELECT |
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 Desarrollo más rápido Compatibilidad con las aplicaciones y generadores de informes existentes |
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é:
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 |
Guía Tecnológica Caché