svn-gvsig-desktop / tags / v1_9_Build_1238 / libraries / libGDBMS / docs / gdbms.html @ 44029
History | View | Annotate | Download (9.85 KB)
1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
---|---|
2 |
<HTML>
|
3 |
<HEAD>
|
4 |
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-1"> |
5 |
<TITLE></TITLE> |
6 |
<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.1 (Linux)"> |
7 |
<META NAME="CREATED" CONTENT="20050304;9024500"> |
8 |
<META NAME="CHANGED" CONTENT="20050323;16380400"> |
9 |
<STYLE>
|
10 |
<!--
|
11 |
@page { size: 21.59cm 27.94cm }
|
12 |
-->
|
13 |
</STYLE>
|
14 |
</HEAD>
|
15 |
<BODY LANG="es-ES" DIR="LTR"> |
16 |
<P>GDBMS</P> |
17 |
<OL>
|
18 |
<LI><P STYLE="margin-bottom: 0cm">Introducción |
19 |
</P>
|
20 |
<LI><P STYLE="margin-bottom: 0cm">Parseado |
21 |
</P>
|
22 |
<LI><P STYLE="margin-bottom: 0cm">Extensibilidad |
23 |
</P>
|
24 |
</OL>
|
25 |
<OL START=3> |
26 |
<OL>
|
27 |
<LI><P STYLE="margin-bottom: 0cm">Drivers</P> |
28 |
<LI><P STYLE="margin-bottom: 0cm">Funciones</P> |
29 |
<LI><P STYLE="margin-bottom: 0cm">Tipos |
30 |
</P>
|
31 |
</OL>
|
32 |
</OL>
|
33 |
<OL START=4> |
34 |
<LI><P>Ejecución de consultas |
35 |
</P>
|
36 |
</OL>
|
37 |
<P><BR><BR> |
38 |
</P>
|
39 |
<P><B>1.- Introducción</B></P> |
40 |
<P>GDBMS es una librería de acceso a datos extensible que |
41 |
permite la ejecución de un subconjunto del estándar SQL |
42 |
sobre fuentes de datos heterogéneas. Esto quiere decir que se
|
43 |
puede realizar una instrucción SQL que involucre tablas que
|
44 |
residan en servidores de base de datos distintos, o incluso entre una |
45 |
tabla de un servidor remoto y un fichero en local.</P>
|
46 |
<P><B>2.- Procesado de instrucciones</B></P> |
47 |
<P>Para ejecutar las instrucciones primero hay que analizarlas
|
48 |
sintácticamente. Esto se realiza con la librería <A HREF="https://javacc.dev.java.net/">javacc</A> |
49 |
usando la gramática <A HREF="sql.html">sql.html</A>, lo cual |
50 |
nos genera un árbol sintáctico asociado a la |
51 |
instrucción y es en esta primera fase donde se detectan los
|
52 |
errores sintácticos.
|
53 |
</P>
|
54 |
<P>Una vez obtenido el árbol sintáctico, se obtiene un |
55 |
arbol de adaptadores de forma paralela en la que cada nodo de dicho |
56 |
árbol se basa en la información del nodo |
57 |
correspondiente del árbol sintáctico para proporcionar |
58 |
información de más alto nivel. Cada nodo del árbol |
59 |
de adaptadores tiene un nodo correspondiente en el arbol sintáctico,
|
60 |
sin embargo, no sucede al revés. Un nodo del árbol |
61 |
sintáctico no tiene por qué tener una correspondencia |
62 |
con un nodo del de adaptadores. Lo que quiere decir esto es que un |
63 |
nodo adaptador puede representar un nodo sintáctico o un
|
64 |
subárbol sintáctico. Durante la ejecución de las |
65 |
instrucciones, se puede pedir información a dicho árbol |
66 |
tal como el valor de una expresión para una determinada fila.
|
67 |
En este caso, asociado a al nodo del árbol sintáctico |
68 |
(nodo sintáctico desde ahora) que representa la expresión |
69 |
habrá un nodo adaptador que en base a los valores de los nodos
|
70 |
sintácticos devolverá el valor de la expresión |
71 |
para la fila que se está evaluando.</P> |
72 |
<P><B>3.- Extensibilidad</B></P> |
73 |
<P>Hay varios puntos en los que se puede extender a gdbms</P> |
74 |
<P STYLE="font-style: normal"><U>3.1.- Drivers</U></P> |
75 |
<P>La fuente de datos sobre la que opera gdbms es un DataSource, que
|
76 |
es una clase que proporciona acceso a los datos que representa y |
77 |
permite algunas operaciones adicionales como acceder a los campos por |
78 |
nombre, etc. Además existen DataSource que son producto de
|
79 |
operaciones, es decir, una join entre dos DataSource es otro |
80 |
DataSource. Las DataSouce's usan a los drivers para acceder a los |
81 |
datos.</P>
|
82 |
<P>Se pueden crear drivers para leer información de ficheros |
83 |
de disco y para acceder a tablas de bases de datos. El acceso a estas |
84 |
últimas se realiza mediante JDBC por lo que se puede acceder
|
85 |
actualmente a cualquier sistema de base de datos para el cual exista |
86 |
un driver JDBC.</P>
|
87 |
<P>Para crear un DataSource en gdbms tenemos varias alternativas.
|
88 |
Todas ellas vienen definidas por la clase DataSourceFactory, que |
89 |
proporciona varios métodos para obtener los DataSource.
|
90 |
</P>
|
91 |
<P>Si la información se encuentra en un fichero o en una base |
92 |
de datos podemos añadir la fuente de datos al sistema mediante
|
93 |
las llamadas addXXXDataSource y luego obtener los DataSource asociado |
94 |
mediante la llamada createRandomDataSource(String sql). De ésta
|
95 |
última llamada, podemos deducir que las fuentes de datos de
|
96 |
base de datos no tienen por qué corresponderse con una tabla
|
97 |
completa y pueden ser una consulta sobre una tabla que recupere un |
98 |
subconjunto de los campos y de los registros. Cabe destacar que en |
99 |
estos métodos estamos indicando datos que definen la fuente de
|
100 |
datos (ubicación del fichero, nombres de las columnas, etc...)
|
101 |
por lo que si se cambia esta información seguramente no se
|
102 |
podrá obtener un DataSource asociado al origen de los datos.</P> |
103 |
<P>Además de los drivers de fichero y de base de datos, |
104 |
existen unas interfaces que al ser implementadas permiten a la |
105 |
factoría crear DataSource. Esto es fundamental para integrar
|
106 |
gdbms en otros sistemas como por ejemplo gvSIG, en la que hay objetos |
107 |
que han leido la información alfanumérica y se quiere |
108 |
obtener un DataSource que acceda a estos datos.</P>
|
109 |
<P>Si la información se encuentra en un objeto que ya contiene |
110 |
la información por estar en un framework de otro sistema y
|
111 |
simplemente se quiere tener un DataSource con la información
|
112 |
de dicho objeto, se deberá usar la llamada
|
113 |
addDataSource(ReadDriver rd, String dataSourceName) y que dicho |
114 |
objeto implemente la interfaz ReadDriver.</P>
|
115 |
<P><U>3.2.- Funciones</U></P> |
116 |
<P><U>3.3.- Tipos</U></P> |
117 |
<P><B>4.- Ejecución de consultas</B></P> |
118 |
<P STYLE="font-weight: medium">La ejecución de una instrucción |
119 |
SQL puede ser delegada en un servidor de base de datos, con el ahorro |
120 |
temporal de la ejecución, si los DataSource's implicados
|
121 |
cumple que son del mismo servidor y son accedidas con el mismo |
122 |
usuario y password y están registrados de una determinada
|
123 |
manera. En caso de encontrarse una SQL que cumpla la condición
|
124 |
anterior se deberá de sustituir los nombres de los datasource
|
125 |
por los nombres de las tablas a las que acceden y al final de la |
126 |
cláusula where habría que añadir con AND las |
127 |
condiciones where de los datasource. Una vez realizado eso se podría
|
128 |
delegar en el servidor dicha instrucción.</P> |
129 |
<P STYLE="font-weight: medium">Las condiciones para delegar la |
130 |
ejecución en el servidor son:</P> |
131 |
<UL>
|
132 |
<LI><P STYLE="font-weight: medium">Que las tablas residan en el |
133 |
mismo servidor.</P>
|
134 |
<LI><P STYLE="font-weight: medium">Que sean accedidas por el mismo |
135 |
usuario, porque de lo contrario el resultado podría tener
|
136 |
datos que no fueran visibles completamente por ninguno de los |
137 |
usuarios de la base de datos</P>
|
138 |
<LI><P><SPAN STYLE="font-weight: medium">Que estén |
139 |
registradas mediante el método addDBDataSource en el que se
|
140 |
le especifica la tabla, la clausula where. Esto limita el conjunto |
141 |
de consultas SQL que se pueden delegar en el servidor ya que la |
142 |
complejidad se reduce significativamente. Hay que realizar un |
143 |
proceso de traducción de nombres de gdbms a los nombres
|
144 |
propios del sistema donde se va a delegar la instrucción
|
145 |
además de añadir la cláusula where de las |
146 |
tablas implicadas, etc, ...</SPAN></P> |
147 |
</UL>
|
148 |
<P STYLE="font-weight: medium">Por otro lado cabe resaltar varios |
149 |
inconvenientes que presenta el hecho de que se delegue en el servidor |
150 |
la ejecución. El primero es que las referencias a campos de la
|
151 |
tabla deben ser cualificadas, ya que de lo contrario se debería
|
152 |
de hacer peticiones adicionales al servidor con la finalidad de saber |
153 |
a qué tabla pertenece cada campo. El segundo es el coste
|
154 |
temporal de ejecutar una consulta sobre varias tablas sin que ésta
|
155 |
se delegue en el servidor. Por una parte hay que traerse del servidor |
156 |
las tablas implicadas que no tiene por qué estar en la máquina |
157 |
local (de hecho es lógico que no sea así) y por la |
158 |
otra, una vez los datos han sido descargados se deberá de
|
159 |
realizar la operación en Java que no destaca por la velocidad
|
160 |
de ejecución. Es por esto que si se quiere realizar una
|
161 |
operación con tablas que residan en el mismo servidor,
|
162 |
conviene añadir una nueva fuente de datos indicando la
|
163 |
consulta SQL que la define. De esta manera nos aseguramos de que la |
164 |
ejecución se realiza en el servidor.</P> |
165 |
<P STYLE="font-weight: medium">En caso de que no se pueda delegar la |
166 |
ejecución en ningún servidor el resultado se computa en |
167 |
el núcleo de gdbms mediante una serie de decoradores que se
|
168 |
ponen sobre los DataSouce's involucrados en la instrucción.
|
169 |
Estos decoradores implementan la interfaz DataSouce por lo que el |
170 |
resultado de la operación es también un DataSouce. Para |
171 |
una ejecución más eficiente se simplifica el arbol de |
172 |
adaptadores. Durante la ejecución de una instrucción, |
173 |
se procesa el subárbol de expresiones múltiples veces |
174 |
para evaluarla, es por esto que la simplificación de este
|
175 |
árbol aporta una aceleración del procesado de las |
176 |
instrucciones. Para simplificar el árbol el proceso realizado
|
177 |
consiste en recorrer el subárbol de expresiones y para cada
|
178 |
expresión que sólo tenga como hijo una subexpresión |
179 |
y no realice ninguna operación sobre el resultado de la
|
180 |
expresión anterior, se hace un bypass del padre a ese único |
181 |
hijo, eliminándose el nodo en proceso. Los nodos susceptibles
|
182 |
de desaparecer son los siguientes:</P>
|
183 |
<UL>
|
184 |
<LI><P STYLE="font-weight: medium">AndExpr</P> |
185 |
<LI><P STYLE="font-weight: medium">NotExpr</P> |
186 |
<LI><P STYLE="font-weight: medium">OrExpr</P> |
187 |
<LI><P STYLE="font-weight: medium">ProductExpr</P> |
188 |
<LI><P STYLE="font-weight: medium">SumExpr</P> |
189 |
<LI><P STYLE="font-weight: medium">Term</P> |
190 |
</UL>
|
191 |
</BODY>
|
192 |
</HTML>
|