130 likes | 215 Views
Bases de Dados OO O caso do Object Store Gabriel David Faculdade de Engenharia da Universidade do Porto gtd@fe.up.pt. Persistência. Persistência em LPOO 1. Ficheiros do sistema operativo: texto estruturado ou registos sem apontadores Þ só permite armazenar alguns tipos de objectos
E N D
Bases de Dados OO O caso do Object Store Gabriel David Faculdade de Engenharia da Universidade do Porto gtd@fe.up.pt
Persistência • Persistência em LPOO 1. Ficheiros do sistema operativo: texto estruturado ou registos sem apontadores Þ só permite armazenar alguns tipos de objectos 2. Imagem da sessão: guardar toda a sessão, o estado dos objectos, as variáveis e o ambiente Þ potencialmente ineficiente; difícil partilhar objectos concorrentemente. O objectivo é tornar a persistência ortogonal ao tipo de objectos. • objectos persistentes, transacções, falhas e recuperação • níveis de persistência dados locais a procedimentos dados que persistem durante uma transacção completa dados da sessão (várias transacções) como user-name e variáveis de ambiente dados que persistem para além da sessão: são os objectos que se guardam na BD e os únicos que são recuperáveis
Persistência e BDOO • Extensões persistentes - criar uma tabela SQL cria o tipo e a extensão - uma classe especifica o tipo e o comportamento; é útil, nas classes com muitas instâncias, considerar que a classe é o contentor de todas as suas instâncias e que há iteradores para navegar eficientemente nos objectos - métodos de lidar com extensões persistentes 1. ao criar uma instância de uma classe persistente guarda-se esta na extensão 2. objectos individuais podem ser declarados persistentes no momento da criação, por exemplo no próprio construtor new 3. usar uma operação explícita de escrita na BD persistente • Persistência por atingibilidade (PS-Algol) - raiz do espaço de objectos: database é um objecto tuplo persistente - se pT é um objecto tuplo persistente, então cada atributo de pT é um objecto persistente - se pS é um objecto conjunto persistente então cada elemento de pS é persistente - em vez de uma só raiz podem existir várias raízes com nome a funcionar de pontos de entrada para o subespaço persistente respectivo • Instâncias persistentes [Object Store] - independente de a classe ser ou não persistente - vários pontos de entrada
Implementação da identidade • espaço transitório versus persistente • aumentar espaço endereçável — esquema de memória virtual com endereços de 32 bits e mecanismo de detectar referências para objectos não locais com transferência transparente [LOOM Smalltalk, Object Store] • endereço versus indirecção • endereço pode ser - endereço de memória virtual - endereço de memória secundária - nome estruturado num ambiente distribuído • indirecção por - tabela em memória [Smalltalk inicial] - índice para objectos em memória secundária Problema: tornar persistentes as referências [permitem construir espaços de objectos estruturados em grafos com partilha referencial]
Endereço ou indirecção • Indirecção ' um passo extra relativamente a ter o endereço ' deixa mover o objecto (garbage collection) • Endereço ' usar directamente o endereço de memória virtual como apontador 1. representação dupla em memória e em disco, com conversão à medida que é necessária 2. armazém persistente organizado como uma memória virtual ' identificadores de registo: nº da página no disco + nº da linha; indirecção local; usado em sistemas relacionais ' identificadores estruturados: indicação do caminho até ao objecto, através de uma convenção de nomes; usado em sistemas distribuídos ' delegados (surrogates): identificadores únicos globais, gerados pelo sistema, independentes do nome, estado, tipo e endereço do objecto; requer indirecção na determinação do endereço
Bases de dados OO • Sumário • Conceitos gerais • Exemplo do ObjectStore) • Arquitectura • Criação de objectos • Gestão da concorrência • Colecções • Perguntas • Índices • Associações
Introdução ao ObjectStore • Base de dados é uma localização na memória para objectos persistentes • BD contém segmentos; segmentos são feitos de páginas • página é a unidade de transferência mínima (8K); não limita o tamanho dos objectos • os segmentos crescem automáticamente e não podem ser fixados num local • Tipos de BD • ficheiro do sistema operativo, definido pelo seu caminho (velocidade intermédia) • sistema de ficheiros crú (rawfs) gerido pelo ObjectStore - montado directamente numa partição (mais rápido) - montado em ficheiros do sistema operativo (mais lento) • ObjectStore é um SGBDOO que permite • criar e modificar objectos C++ (ou Smalltalk) em vez de tabelas, linhas e colunas • aceder aos dados com o mesmo formato em que existem na aplicação • descrever, memorizar e pesquisar dados complexos • memorizar persistentemente dados independentemente do tipo
Processos • Servidor — processo que gere o acesso às bases de dados • memoriza e disponibiliza páginas de dados persistentes • arbitra acessos concorrentes • recuperação de falhas • arranque automático na inicialização da máquina • Aplicação cliente — programa do utilizador que pode aceder a várias BD • num só sistema de ficheiros ø um servidor • sistemas de ficheiros diferentes ø vários servidores • liga-se a biblioteca ObjectStore cliente para - mapear objectos da BD persistente em endereços de memória virtual - reservar e libertar memória persistente - manter cache das páginas recentes e lidar com as faltas pedindo-as ao servidor • Gestor de cache — processo que corre na máquina da aplicação • um só por máquina • coordena o acesso concorrente das várias aplicações aos dados persistentes que se encontram na cache a partir das mensagens de retorno do servidor
Processos Aplicação Gestor da cache Servidor Servidor nó nó Disco Disco nó nó nó Gestor da cache Gestor da cache Aplicação Aplicação Aplicação
Gestão de memória Uma cache por cliente Cache cache Cache Espaço de endereços; dados estão na memória virtual memória transitória Heap memória transitória Stack memória persistente Um espaço de endereços por cliente memória física Todos os clientes usam o mesmo espaço de swap Swap
Mapeamento de memória • Transferência entre a BD e a memória do programa automática e transparente • ObjectStore detecta qualquer referência a memória persistente e transfere a página respectiva pela rede para a cache e mapeia para memória virtual — acesso tão rápido como a dados transitórios • Dados em C++; apontadores para memória virtual (32 ou 64 bits) • Nos segmentos da BD existem pseudo-endereços — relocalização • Mapa de relocalização permanente — determina a localização de um objecto no disco • Mapa de relocalização transitório — determina localização de objecto cliente na cache • Relocalização na leitura e na escrita • Vantagens: • persistência especificada à instância; independente do tipo, incluindo pré-definidos (reusar código normal) • apontadores processados à velocidade do hardware da memória (virtual) e não através de apontadores soft • Requere-se informação sobre o esquema de cada BD e de cada aplicação em ficheiros fonte e nas próprias BD
Construção de aplicações • Começar por recorrer ao utilitário gerador de esquemas (ossg) - entrada: ficheiros fonte de esquema + esquemas de biblioteca - saída: BD do esquema da aplicação e respectivo ficheiro fonte - o que fica pode ser só o que foi declarado nos ficheiros, ou considerar os declarados apenas como pontos de entrada e incluir também o que estiver no fecho transitivo de acesso a partir daqueles • O ficheiro fonte tem que ser compilado e ligado com a aplicação - poder ser usado um qualquer compilador de C ou C++, de preferência com templates - sugere-se cxx no jerry, o compilador da Digital • Liga-se habitualmente pelo menos a biblioteca base do ObjectStore #include <ostore/ostore.hh> e começa-se por chamar a função membro estática objectstore::initialize() excepto nos casos em que é necessário chamar objectstore::set_application_schema_pathname() objectstore::set_cache_size() objectstore::set_client_name()
Ambiente • acrescentar no ficheiro de inicialização de uma sessão no riff OS_ROOTDIR=/usr/local/ODI/OS5.0 export OS_ROOTDIR PATH=$PATH:$OS_ROOTDIR/bin LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OS_ROOTDIR/lib export LD_LIBRARY_PATH • a saída do servidor fica registada em /tmp/ostore/oss_out e pode ser útil para depuração