Armazenamento de Informação em HSQL LEIC-Tagus – TDB 05/06 Bruno Azenha nº 51377 Tópicos Introdução Interacção dos componentes Suporte físico Tabelas Conteúdo das tabelas Armazenamento e acesso a dados Acessos em memória Metadados e scripts Tipos dados especiais Aplicações Práticas Introdução SGBD implementado em Java que corre numa JVM Ligações ao SGBD através de interface JDBC OpenSource Suporta um grande conjunto dos standards SQL 92 e 200n, acrescentado algumas extensões proprietárias Três modos de operação: “in-memory”, “standalone” e “client/server” Interacção dos componentes As aplicações do utilizador só podem aceder através de uma interface JDBC Características dos modos de operação: Aplicação e BD na mesma JVM Ligação HTTP através da Internet com recurso a um WebServer ou a uma Servlet Ligação TCP/IP (Intranet) usando um servidor dedicado Demonstration programs and Tools JDBC Interface HTTP Connection WebServer Standalone Servlet Database Engine HSQL Connection Server Suporte físico Cada BD consiste num conjunto de ficheiros: teste.properties – propriedades genéricas da BD teste.script – contêm a definição em SQL das tabelas, dos dados e de outros objectos da BD, para as tabelas em memória teste.log – contém as alterações recentes à BD teste.data – contém os dados para as tabelas em disco teste.backup – é uma cópia de segurança comprimida do último estado consistente conhecido para o ficheiro “.data” teste.lck – é usado para assinalar que a BD está aberta Tabelas (1/3) O HSQL suporta tabelas temporárias (TEMP) e 3 tipos de tabelas persistentes: em memória (MEMORY) e em disco (CACHED) e de texto (TEXT) As tabelas temporárias só duram enquanto a ligação está activa Para as tabelas em memória: Sempre que a BD é iniciada são lidos todos os dados existentes no ficheiro “.script” Todos os dados são escritos de memória para disco quando é executado o comando de SHUTDOW Tempos de acesso menores que as tabelas em disco Ideais para pequenos conjuntos de dados Tabelas (2/3) Para as tabelas em disco: Os dados só são lidos do ficheiro “.data” quando a tabela é acedida Só são mantidos em memória parte dos dados e dos índices Ao se executar o SHUTDOW, são escritos os dados alterados e são efectuadas cópias de segurança de todas as tabelas em disco É possível configurar a quantidade de dados a serem mantidos em cache Ideais para tabelas contendo grandes conjuntos de dados Tabelas (3/3) Para as tabelas de texto: Usam ficheiros CSV com fonte de dados O uso de memória é mais eficiente pois assenta no carregamento para memória da totalidade dos índices e apenas uma pequena parte dos dados Têm a vantagem da portabilidade e legibilidade do formato Ficam a perder em termos de desempenho para os outros dois tipos de tabelas persistentes Conteúdo das tabelas Nome (não visível) Descrição da coluna (nome, tipo dados, …) Um ou mais índices (os túpulos só são acessíveis através de índices) Gestor de acesso a ficheiros se for uma tabela em disco (DataFileCache) Restrições de integridade (se existirem chaves estrangeiras) Se o utilizador não criou uma chave primária, são criados automaticamente uma coluna e índices ocultos Table Column (Vector) Index (Vector) Cache Constraint (Vector) Armazenamento e acesso a dados O índice é uma AVL binary tree (uma árvore binária especial) Cada índice contém um nó raiz (que é “null” se a tabela estiver vazia) Cada nó pode ter um nó pai e nós filhos esquerdo e direito Cada nó está ligado a um túpulo (a linha que contém os dados) Os dados são um array de objectos Index Node [root] Node [parent] Node [left] Node [right] Row [data] Table Object (array) [data] Acessos em memória A “cache” é uma hashtable Adicionalmente, os túpulos encontram-se ligados com listas duplamente ligadas Se existirem muitos registos em cache, os mais antigos são guardados (se necessário) e removidos de memória Cache Data (array) Row .data: [contains the binary records and empty blocks] Metadados e scripts As tabelas de sistema são construídas dinâmicamente (só quando são necessárias e em memória) pela classe DatabaseInformation Chamadas às funções da DatabaseMetaData permitem obter dados das tabelas de sistema SYSTEM_CONNECTIONINFO retorna informação sobre a ligação actual jdbcDatabaseMetaData Database Table (Vector) Access DatabaseInformation MetaData SYSTEM_TABLES SYSTEM_COLUMNS SYSTEM_TYPEINFO SYSTEM_INDEXINFO ... SYSTEM_CONNECTIONINFO Script generator SYSTEM_SCRIPT Log Tipos de dados especiais Suporte para os tipos OTHER e OBJECT (são mapeados para java.lang.Object Torna possível o armazenamento de dados binários nas colunas : fotografias, objectos Java serializados, músicas, entre outros Recurso à ferramenta “SQL Tool” e a prepared staments: \bl /tmp/favoritesong.mp3 \bp INSERT INTO musictbl (id, stream) VALUES(3112, ?); SELECT stream FROM musictbl WHERE id = 3112; \bd /tmp/favoritesong.mp3 O tamanho máximo do objecto é ditado pela memória disponível Na prática, SGBDS de produção têm suportado com sucesso objectos até um megabyte Aplicações Práticas OpenOffice.Org 2.0 JBoss JFox Mathematica TrackStudio Outros… Bibliografia HSQL Development Group, Hypersonic SQL Arquitecture, www.hsqldb.org, 2005 HSQL Development Group, Hsqldb User Guide, www.hsqldb.org, 2005 Benoît Marchal, Hypersonic SQL: A Desktop Java Database, http://www.developer.com/db/article.php/629 261