BASEADA EM ESPAÇO DE TUPLAS. Documentação Final

Tamanho: px
Começar a partir da página:

Download "BASEADA EM ESPAÇO DE TUPLAS. Documentação Final"

Transcrição

1 UMA INFRA-ESTRUTURA PARA REPLICAÇÃO TOLERANTE A FALTAS BIZANTINAS BASEADA EM ESPAÇO DE TUPLAS Documentação Final Documento apresentado ao Programa de Ensino Projeto Final I da Pontifícia Universidade Católica do Paraná, sob orientação do Prof. Altair Olivo Santin. I Jen Fan Tatiana Pereira Filgueiras Segundo Bimestre 2008

2 RESUMO Um dos grandes problemas na construção de aplicações distribuídas são as ameaças que circundam o ambiente. Estas ameaças podem variar desde problemas de hardware a vulnerabilidades de segurança, que por sua vez resultam em ataques. Neste trabalho propomos uma nova infra-estrutura tolerante a faltas bizantinas para a construção de sistemas distribuídos, que consiste no uso de replicação ativa sobre um paradigma de comunicação alternativo. O núcleo desta arquitetura é baseado no modelo de coordenação generativa, onde um espaço de tuplas é usado para prover o suporte de comunicação tolerante a faltas bizantinas, além de ser usado para atividades como acordo e consenso bizantino para os diversos componentes da infra-estrutura proposta.

3 1. INTRODUÇÃO A grande profusão de aplicações por meio de serviços distribuídos em redes de comunicação e computadores tem crescido de forma notória. Comumente estes sistemas são postos a provas de sua confiabilidade, isso em relação aos fatores externos que circundam os ambientes de comunicação heterogêneos e distribuídos. Uma solução que tem sido amplamente empregada na construção de aplicações distribuídas é a redundância de componentes de software por meio de replicação de serviços [Guerraoui and Schiper, 1997]. As técnicas de replicação combinam uma série de mecanismos que contribuem para a manutenção da disponibilidade e integridade das aplicações. Usualmente, os processos de aplicações distribuídas executam e coordenam suas atividades sobre ambientes de redes de comunicação heterogêneos e não confiáveis, tendo como primitivas básicas de comunicação os Sockets TCP/IP ou RPC. Conseqüentemente, tais processos ficam sujeitos a diversos problemas intrínsecos a este tipo de comunicação direta, tais como timeouts e desconexões freqüentes. Sendo assim, existe uma grande motivação para o uso de paradigmas de comunicação e coordenação alternativos [Cabri et al., 2000], que permitam o desenvolvimento de aplicações complexas e capazes de suportar os problemas citados. E é neste contexto que o modelo de coordenação generativa (ou coordenação por espaço de tuplas) [Gelernter, 1985] se mostra como uma das melhores alternativas de adoção em virtude de seu poder e sua simplicidade de uso, além de ser o modelo mais adequado para sistemas com características dinâmicas. Muitos têm sido os esforços da comunidade de sistemas distribuídos na tentativa de desenvolvimento de novos algoritmos e esquemas alternativos a tolerância a faltas bizantinas. Dentre eles, [Bessani et al., 2006b] propõe um novo modelo de computação e coordenação de processos através de objetos de memória compartilhada robustos e capazes de suportar ações maliciosas, e também demonstra que um serviço de espaço de tuplas bem definido pode prover suporte de sincronização capaz de implementar acordo e consenso em sistemas distribuídos de forma simples e eficaz. Por outro lado, no modelo de [Vandiver et al., 2007], é proposto um esquema de replicação heterogêneo para banco de dados de baixo custo adicional no serviço replicado. Neste trabalho propõe-se uma infra-estrutura que provê integridade, disponibilidade e confidencialidade para aplicações distribuídas por meio de replicação máquina de

4 estados [Schneider, 1990] tolerante a faltas bizantinas, agregando alguns componentes de segurança (criptografia, assinaturas etc) na arquitetura para prover todas estas garantias. O objetivo do projeto é fornecer estas garantias a despeito de faltas bizantinas que possam ocorrer no ambiente. Além do mais, o crescimento da importância dos sistemas de software, incorre para que uma infra-estrutura com segurança de funcionamento [Avizienis et al.2004] seja essencial no processo de desenvolvimento de softwares fidedignos. Nos últimos tempos, replicação tolerante a faltas bizantinas tem sido investigada em diversos trabalhos, sendo que as contribuições mais relevantes são o BFT [Castro and Liskov, 1999], que propõe um algoritmo para fins práticos e com pequeno custo adicional no serviço replicado, e [Yin et al., 2003] que propõe um modelo arquitetural onde é feita uma separação das atividades de um serviço replicado. O BFT necessita de 3f + 1 réplicas para proceder com o serviço de replicação, já a arquitetura de separação necessita de 3f + 1 réplicas para o acordo bizantino e mais 2f + 1 réplicas para executar as requisições. Nosso trabalho necessita de somente 2f + 1 réplicas, tanto para o acordo bizantino como para executar as requisições de serviço, enquanto provê as mesmas garantias dos trabalhos anteriores. O projeto é fundamentado no modelo de PEOs [Bessani et al., 2006b], onde os processos interagem através de um objeto de memória compartilhada resistente a faltas bizantinas. O modelo de PEOs considera o uso de políticas de acesso para manter a integridade do meio de coordenação contra ações indevidas. Considera-se também o uso de um espaço de tuplas para atividades de acordo e consenso bizantino e também para a implementação de mecanismos de checkpointing, logging e recovery necessários em uma infra-estrutura que se propõe a tolerar faltas bizantinas. O documento está organizado da seguinte forma: Na seção 2 apresenta-se uma breve descrição da teoria de espaços de tuplas. Na seção 3 o detalhamento do projeto, onde estão contidos o diagrama de classes e suas respectivas explicações. A seção 4 apresenta o cronograma atualizado do projeto, bem como as etapas já concluídas. Na seção 5 é apresentado os procedimentos de teste e validação do projeto. A seção 6 apresenta os planos de teste. A sessão 7 quadro de riscos, com análise de tais revisadas. Na sessão 8 é apresentado os resultados da implementação, na seção 9 é apresentada a conclusão do trabalho e na seção 10 as referências bibliográficas. Este documento ainda contem 3 anexos (A, B e C) contendo códigos implementados, documentação e telas de execução em ambiente LINUX.

5 2. ESPAÇO DE TUPLAS E EXTENSÕES O paradigma de espaço de tuplas é oriundo do modelo de coordenação generativa [Gelernter 1985], tendo sua implementação na linguagem LINDA. A principal idéia do espaço de tuplas é a existência de uma abstração de memória compartilhada (o próprio espaço), onde os processos podem realizar a inserção e recuperação de dados, na forma de tuplas. Uma tupla t = f 1,f 2,...,f n pode ser definida como uma seqüência de campos, na qual cada campo f i pode um valor de qualquer tipo de dados, pode ser um campo formal (uma variável)?, ou ainda um símbolo especial *. Um campo formal é usado para extrair conteúdos individuais da tupla, e não a mesma. Os símbolos especiais são usados para representar conteúdos sem tipos/valores definidos. Sendo assim, uma tupla pode ser formada por um único tipo de campo, ou também pela combinação dos três tipos de campos descritos. Um tupla t cujos campos são todos valores definidos é denominada entrada (entry), já uma tupla que em sua formação possui pelo menos um campo do tipo formal ou especial é denominada molde (template) e é formalmente representada por t. Uma característica fundamental do espaço de tuplas é o acesso às tuplas realizado de forma associativa 1, isto é, não a partir do endereço da tupla, mas a partir do seu conteúdo. Deste modo, a leitura ou remoção de tuplas do espaço é feito a partir da combinação de tuplas e moldes. Um molde t combina com uma entrada t se ambas as tuplas possuem o mesmo número de campos, e todos os campos definidos de t contem o mesmo valor do campo correspondente em t. Por exemplo, a tupla 2008, ALGO combina com os moldes 2008,*, *,* e *, ALGO, mas não com *, OUTRO. As manipulações no espaço de tuplas são realizadas a partir das operações out(t), in(t) e rd(t) [Gelernter 1985]. A operação out(t) é usada para a inserção de tuplas (entradas) no espaço; in(t) é a operação que realiza a leitura e remoção da(s) tupla(s) t que combina(m) com o molde t fornecido na operação; e rd(t), que permite a leitura da(s) tupla(s) que combina(m) com o molde t fornecido, mas sem retirá-las do espaço de tuplas. As operações de recuperação de tuplas são não-deterministas, isto é, caso exista um conjunto de tuplas que combine com o molde fornecido, qualquer uma delas pode ser escolhida de forma aleatória como retorno da operação. Vale salientar que as operações in e rd são bloqueantes, e sendo assim, caso não exista nenhuma tupla que combine com o molde fornecido, o processo permanece bloqueado até que uma tupla que combine com o molde seja inserida no espaço, para então completar a operação. Uma extensão 1 Similar ao SELECT do SQL

6 comum ao modelo é a provisão de duas operações variantes de in e rd não bloqueantes, que são respectivamente inp e rdp, e possuem o mesmo comportamento que as operações bloqueantes, exceto pelo fato de que elas retornam mesmo que não exista nenhuma tupla que combine com o molde fornecido, isto é, estas operações retornam um valor false, caso contrário, é retornado um valor true juntamente com a tupla lida. Para permitir a resolução do problema de consenso o modelo de espaço de tuplas admite em sua especificação outra operação de inserção condicional denominada cas, sendo esta denotada por cas(t,t) [Segall 1995]. A operação cas(t,t) funciona como a execução indivisível do código: if rdp(t) then out(t), isto é, caso a leitura do molde t falhar, então a inserção da tupla t é realizada no espaço, caso contrario, alguma tupla que combina com o molde t é retornada para o processo que invocou a operação. A operação cas permite que o espaço de tuplas seja capaz de resolver o problema do consenso em ambientes assíncronos [Segall 1995]. Figura 1. Replicação por meio de espaço de tuplas

7 2.1. TOLERÂNCIA A FALTAS EM ESPAÇO DE TUPLAS Visando prover a tolerância à faltas no paradigma de espaço de tuplas, alguns trabalhos propuseram o uso de replicação, tendo o uso de diversas cópias do espaço em diferentes servidores, de modo a evitar que a ocorrência de uma falta em algum dos servidores prejudique o funcionamento do sistema [Xu and Liskov 1989, Bakken and Schlichting 1995]. No entanto, os trabalhos de [Xu and Liskov 1989, Bakken and Schlichting 1995] apenas consideram faltas por parada. Um trabalho mais recente propôs uma extensão para espaços de tuplas, o modelo PEATS (policy enforced augmented tuple space) [Bessani et al. 2006]. O PEATS consiste em um espaço de tuplas tolerante a faltas bizantinas, onde fornece uma série de mecanismos capazes de lidar com processos maliciosos que tentam fazer o uso do espaço. No PEATS as interações entre os processos são reguladas por políticas de granularidade fina, sendo estas usadas como mecanismo de controle de acesso ao espaço de tuplas. As políticas são compostas por um conjunto de regras que são definidas por meio da especificação de padrões de invocação e condições que devem ser satisfeitas para que uma operação seja executada sobre o espaço. As regras são definidas para cada uma das operações do espaço (in, rd, out,...), e uma característica interessante do PEATS é que as operações que não são especificadas nas políticas tem sua execução negada por padrão. Este trabalho foi implementado com base em um PEATS, mais especificamente no DepSpace [Bessani et al. 2007].

8 3. DETALHAMENTO DO PROJETO 3.1. DIAGRAMA DE CLASSES Figura 2. Diagrama de Classes Completo

9 Figura 3. Diagrama de Classes tuplespace.dbserver

10 Figura 4. Diagrama de Classes tuplespace.jdbc

11 3.2. DESCRIÇÃO DOS BLOCOS Todos os blocos a serem descritos estão sendo implementados na linguagem JAVA e testados nos sistemas operacionais LINUX e WINDOWS. Como IDE está sendo utilizado o Jcreator LE versão Como servidores de banco de dados serão adotados: MySQL, PostgresSQL e Firebird. Como espaço de tuplas foi adotado o DepSpace. ::tuplespace.jdbc DriverTs: Classe responsável pela conexão da interface ao espaço de tuplas. Connection: Classe responsável pela escolha do tipo de tupla a ser enviada ao espaço de tuplas. Também é responsável pelo acesso ao espaço de tuplas. Statement: Classe responsável pela retirada da tupla de requisição enviada pelo cliente e criação de tupla de resposta do servidor ao cliente. Esta classe retirará a tupla e a passará posteriormente para a classe responsável pelo envio dos comandos SQL ao banco de dados (TsDBServer), e também aguardará a resposta da classe mencionada e preparará a tupla para envio ao cliente. Também solicitará o acordo bizantino das respostas recebidas à classe responsável por tal (Consensus). PreparedStatement: Classe teste, ainda sendo estudada se há ou não necessidade de sua criação. CachedRowSetTS: Classe que através de uma classe pré-estabelecida pela sun (com.sun.rowset.cachedrowsetimpl) pede a execução de determinado comando SQL ao banco de dados, e guarda consigo a resposta para tal, de forma desconectada do banco de dados. Um objeto de CachedRowSet contém filas de um result set (ponteiro utilizado em tabelas SQL) ou uma tabela inteira. Esta classe foi criada visando a necessidade da instrução SELECT de um RecordSet (RS). Como a instrução retorna dados distintos, e não quantidade de alterações fez-se necessária uma classe que a trata-se diferentemente das outras instruções, já que a mesma se difere das demais. ServerReply: Classe responsável pelo armazenamento das respostas dos servidores de banco de dados juntamente com seus respectivos hashes. Guardará dados como número de linhas alteradas, hashes, estado e outros que ainda serão avaliados. Servirá para a classe responsável pelo consenso, pois tal se dará pela comparação de hashes de resposta. ExceptionTS: Classe responsável pela detecção e tratamento de exceções na

12 comunicação com o espaço de tuplas e servidores. TwaitResponse: Thread da classe Statement. Com tal classe tentar-se-a criar um meio de comunicação espaço de tuplas servidor/cliente, ao qual toda vez que surgir uma tupla do tipo a ser lida por cliente ou servidor o próprio espaço de tuplas comunique ao destinatário a chegada, evitando assim o loop de checagem realizado pelos mesmos. ::tuplespace.dbserver TsDBServer: Interface Servidor responsável pela espera de requisições dos clientes que serão enviadas à ele já separadas por classe(pedido, Comando SQL, ID do cliente etc) pela classe Statement. Essa é a classe principal de comunicação Cliente -> Servidor de banco de dados, que intermediará tal através do espaço de tuplas e dará ao cliente a sensação de transparência nas execuções. ExecutionServer: Thread da classe TsDBServer que se conectará aos bancos de dados, enviando a requisição preparada pela classe Statement e esperará o atendimento da requisição de tais pelos bancos de dados. A cada resposta, enviará à classe Statement para que tais sejam processadas devidamente como já mencionado no item 3. ::tuplespace.utils ConfigurationParameters: Classe responsável pela leitura do arquivo de texto onde contêm as configurações do banco de dados tais como: número de servers a mais rodando (além do próprio que está acessando o arquivo de configuração), driver do banco de dados (se distintos, cada servidor terá um arquivo diferente), url do banco de dados, database, porta, usuário e senha para acesso a tal. Consensus: Classe responsável pelo acordo bizantino. Receberá os hashes das respostas dos servidores e fará o consenso, levando em conta o algoritmo de Lamport com chaves de sessão (2f+1). Retornará a decisão tomada (o hash com f+1 repetições). HashUtils: Classe responsável pela codificação/decodificação de objetos em hashes encriptados. ::tuplespace.examples Client: Interface cliente responsável pela leitura da string SQL pelo teclado do usuário, requisição de criação de tupla do tipo REQUEST e envio de tal ao espaço de tuplas para ser processada pela função TsDBServer.

13 3.3. FUNCIONAMENTO DO PROTÓTIPO O sistema consiste na implementação do modelo de Replicação de Máquina de Estados [Schneider 1990] tendo como elemento de comunicação um espaço de tuplas tolerante a intrusões (o PEATS). No sistema, o espaço de tuplas fornece o suporte de comunicação usado nas interações entre os clientes e servidores, e também uma ambiente de armazenamento estável e seguro para as informações comuns entres as réplicas do serviço. O principio básico de funcionamento do protótipo é ilustrado na Figura 4, onde os clientes enviam suas requisições para o serviço na forma de tuplas (passo 1), as réplicas do serviço lêem as tuplas com as requisições a serem executadas do espaço (passo 2) e em seguida processam as requisições, posteriormente enviando os resultados para os respectivo cliente também na forma de tuplas (passo 3). Por fim, o cliente obtém as respostas das advindas das replicas por meio das tuplas de respostas (passo 4). Conforme descrito na literatura [Schneider 1990, Lamport 1978], um modelo de replicação tem como requisito básico o determinismo de réplicas, isto é, as réplicas são inicializadas com o mesmo estado inicial, e devem executar a mesma seqüência de operações. Deste modo, todas as réplicas devem ter uma evolução sincronizada, o que conseqüentemente permitirá com que todas elas cheguem ao mesmo estado final. Na prática, a implementação de serviços deterministas requer o uso de protocolos de difusão atômica [Défago et al. 2004], que asseguram que todas as requisições enviadas ao sistema são executados por todas as réplicas (acordo) em uma mesma ordem (ordem total). Em nosso sistema, todos os algoritmos e protocolos de suporte a replicação (inclusive o de difusão atômica) são implementados através do espaço de tuplas. No entanto, para que o sistema tenha o seu pleno funcionamento é necessário admitir algumas considerações no ambiente do sistema. Admitiu-se um modelo de sincronismo híbrido. O modelo de computação e comunicação do espaço de tuplas é assíncrono, contudo, uma vez que se assumiu que o espaço de tuplas é tolerante a intrusões, o DepSpace é replicado a partir do algoritmo PAXOS [Lamport 2001] que, para o seu funcionamento correto, requer sincronismo parcial [Dwork et al. 1988]. É valido salientar que, tendo em vista que o espaço de tuplas é tolerante a intrusões, o mesmo não é suscetível a falhas, e sendo assim, o elemento de comunicação do sistema apresentado é estável e seguro. Vale salientar que o mesmo é tolerante a faltas bizantinas [Lamport et al. 1982], até n 1 f 3 réplicas do DepSpace e n 1 t 2

14 réplicas de um serviço do protótipo podem falhar de forma arbitrária em suas especificações. Estas falhas podem ser decorrentes de faltas bizantinas, onde os processos podem parar, omitir o envio ou recepção de mensagens, enviar respostas incorretas, etc. Também admitiu-se que todos os processos envolvidos no sistema possuem relógios locais, e tais relógios não são sincronizados, sendo sua única premissa progredir ALTERAÇÕES NO MODELO DO PROTÓTIPO Devido a uma requisição do líder do projeto de iniciação científica ao qual este protótipo fará parte, o consenso bizantino passou a ser tratado na camada Statement do cliente e não do servidor, como fora abordado desde o princípio. O funcionamento básico consiste em: A interface Client envia à interface Statement a requisição SQL; A classe Statement cria a tupla e envia tal para o espaço de tuplas; A interface TsDBServer retira as requisições e as passa para os bancos de dados, aguarda resposta de tais, e envia as respostas ao espaço de tupla; A interface Statement do cliente retira f+1 respostas do espaço de tuplas e pede o consenso bizantino; Uma vez com a decisão em mãos, envia-a para o cliente. Figura 5. Princípio do Funcionamento do Protótipo

15 4. CRONOGRAMA Etapas: a. Proposta de um modelo de integração WebServices e espaço de tuplas; b. Estudo Bibliográfico sobre WebServices; c. Estudo dos Padrões FT-CORBA e espaço de tuplas; d. Estudo de suportes para desenvolvimento de WebServices; e. Elaboração e entrega do Plano de projeto; f. Defesa do Plano de Projeto; g. Instalação e teste do J2EE e DepSpace; h. Implementação e teste do modelo proposto; i. Elaboração do Projeto Físico; j. Entrega e Defesa do Projeto Físico; k. Revisão do Projeto Físico; l. Entrega do Projeto Físico Revisado; m. Defesa do protótipo; n. Elaboração do relatório final ; o. Entrega do Relatório Final; p. Defesa da implementação Final. Obs: Os itens em vermelho já foram concluídos. Tabela 1: Cronograma Aug/07 Set/07 Out/07 Nov/07 Dez/07 Jan/08 Fev/08 Mar/08 Abr/08 Mai/08 Jun/08 A X X B X X C X X X D X X E X F X G X X X X H X X X X X X X X I X X J X K X X X L X M X N X X X O X P X

16 5. PROCEDIMENTOS DE TESTE E VALIDAÇÃO DO PROJETO 5.1. TESTES EM CAIXA PRETA (PONTO DE VISTA DO USUÁRIO) O usuário executará um programa (em prompt) no qual será solicitado o comando SQL a ser executado no servidor de banco de dados. Ele entrará com o comando e ao teclar ENTER aguardará alguns instantes. O resultado do comando será exibido no próprio prompt. Caso o comando seja uma alteração na tabela, será apresentado o número de linhas alteradas em tal. Na visão do usuário, ele se conecta diretamente e se comunica remotamente com a base de dados TESTES EM CAIXA BRANCA (PONTO DE VISTA DO SISTEMA) ESTUDO DE CASO O ponto chave da implementação é a não precisão de modificações nas réplicas que contém os sistemas de gerência de bancos de dados heterogêneos, o que permite o uso do esquema de replicação em qualquer máquina executando um sistema de gerência de banco de dados independente [Gashi et al., 2004]. A biblioteca que será construida é baseada no JDBC, considerando um subconjunto das operações de acesso a banco de dados disponibilizado na API JDBC. O JDBC abstrato que será implementado funcionará através do protótipo e permitirá a execução dos principais comandos SQL (insert, update, delete, select) e stored procedures. Contudo assumiu-se somente a execução de instruções SQL escritas em SQL-ANSI [X , 1992] em virtude desta linguagem ser aceita pelos principais SGBDs de mercado. Os métodos JDBC para execução de instruções SQL retornarão três tipos de resultado. O método execute retornará um dado do tipo boolean sinalizando se o SQL foi executado com êxito ou não. Já o método executeupdate retornará um inteiro que indica a quantidade de linhas afetadas pelo SQL. O terceiro método, executequery, retornará um conjunto de dados resultante da operação SQL executada. Neste caso, o componente Java que será utilizado é o CachedRowSet, pois ele permite a serialização dos conjuntos de dados e consiste de um mecanismo alternativo para acesso a bancos de dados desenvolvido pela Sun, tendo seu funcionamento similar ao ResultSet. Consideraremos parcialmente o uso de diversidade de projeto na implementação do protótipo a partir do uso de três SGBDs diferentes, o que foi motivado pelo trabalho de [Gashi et al., 2004].

17 Os SGBDs a serem utilizados na validação do protótipo serão os seguintes: MySQL, PostgresSQL e Firebird. A diversidade de bancos de dados [Gashi et al., 2004] faz do serviço não somente tolerante a intrusões, mas também tolerante a bugs, pois os defeitos de um SGBD em particular não afeta o funcionamento do projeto. O ambiente de validação do protótipo consistirá de um serviço simplificado de replicação de bancos de dados, onde será montada uma arquitetura composta por 3 servidores de bases de dados, cada um contendo um sistema de gerência de bancos de dados independente, mas com o mesmo Schema 2 de banco de dados. Uma vez que será utilizado um espaço de tuplas para prover as interações (coordenação) entre os processos. Considerar-se-á o uso do DEPSPACE [Bessani et al., 2007] replicado, para prover a segurança de funcionamento do meio de coordenação, de modo que ele permaneça em correto a despeito de falhas bizantinas apresentadas pelos processos envolvidos no sistema. Considerando a alta disponibilidade e robustez provida pelo meio de coordenação, isso garante que o suporte de comunicação e sincronização manterá sua integridade, mesmo que processos faltosos e/ou intrusos tentem contra ele AVALIAÇÃO DE DESEMPENHO Visando avaliar o desempenho do protótipo, serão realizados alguns experimentos, considerando para tal a latência despendida na execução de uma operação no serviço replicado. A latência observada no experimento será dividida em três componentes: 1. Que compreende o tempo de envio da requisição pelo cliente; 2. Que diz respeito ao tempo de execução da operação no servidor; 3. Que corresponde ao tempo de envio da resposta ao cliente. As observações se darão a partir do ambiente do protótipo. Os valores apresentados representarão o tempo (milissegundos) médio necessário para execução de uma operação pelo protótipo, de acordo com a instrução executada. Tal tempo representará o tempo total transcorrido pela execução de uma operação, que compreenderá desde a solicitação por parte do cliente, processamento da instrução pelo protótipo e recebimento das respostas ao cliente. 2 Schema denota um conjunto de objetos que compõe um banco de dados.

18 6. PLANOS DE TESTES Figura 6. Diagrama em Blocos da execução do Cliente

19 6.1. TESTES A SEREM REALIZADOS Possuindo a seguinte base de dados nos bancos de dados Firebird e MySQL: DATABASE: usuarios TABLES: teste, backp cod_teste(int) Tabela 2. TABLE teste nom_teste(varchar(20)) 1 cristina 2 tatiana 3 I jen 4 Aldelir 5 Fernanda 6 Ichika 7 Cassiano 8 Karina 9 Roberto 10 Julia 11 Fabiana 12 Adriana 13 Jefferson 14 altair 15 Zigfrida 16 Michael 17 Allison 18 Liu Ming 19 Lau 20 Jim 21 Julie

20 22 Adriane 23 Margarida 24 Thais 25 Mollica 26 Mauricio 27 Fernando 28 Fernando c 29 Jimi 30 Marciel 31 Douglas 32 Fabio 33 Benicio 34 Sekai Sendo backp uma cópia de teste, pretende-se interagir com tal tabela por meio da interface Client, solicitando os seguintes comandos: Comando Tabela 3. Testes e Resultados esperados Resultado esperado Select * from teste update teste set nom_teste = 'paloma' where cod_teste = 25 Impressão em tela de todos os registros da tabela teste Troca do nom_teste Mollica por Paloma. Impressão em tela de 1 linha afetada. delete from teste where nom_teste = 'julia' Exclusão da linha 10. insert into teste values (10,'julia') Acréscimo de uma linha. O número total de servidores de banco de dados são três, sendo os dois mencionados anteriormente e o PostgreSQL, este último, contendo dados errados na tabela, para fins de simulação de servidor faltoso. O cliente deve ter a impressão de estar agindo diretamente com o banco de dados, sem intervenção do espaço de tuplas. O tempo

21 médio de resposta ao cliente não deve ultrapassar 1 segundo. Vale salientar que antes do envio da requisição ao banco de dados, a interface do servidor deve utilizar consenso bizantino para decidir qual comando deve ser repassado ao banco de dados, no caso de máquinas faltosas FUNCIONALIDADES VALIDADAS As seguintes funcionalidades foram validadas pelos testes: Envio de tupla de requisição do cliente ao espaço de tuplas; Resgate de tupla de requisição do cliente pela interface servidor (TsDBServer); Tradução e envio da sintaxe SQL para o servidor de banco de dados correspondente a interface TsDBServer; Recebimento de resposta do banco de dados; Criação de hash de resposta do banco de dados; Envio de resposta ao espaço de tuplas; Resgate da resposta pelo Statement do cliente; Consenso bizantino com os hashes de resposta; Impressão em tela da resposta correta.

22 7. ANÁLISE DE RISCOS Tabela 4: Previsão e dimensionamento dos riscos Id Descrição do Risco Tempo disponível para dedicação de desenvolvimento do projeto. Adaptação a tecnologia Java. Perda de dados devido à falha física em um dos servidores. Probab ilidade de ocorrê ncia Impact o no projet o Severi dade Ação para prevenção Ocupar o tempo livre disponível. Acompanhar sempre a atualização da tecnologia Java. Executar as réplicas com uma máquina a mais do número mínimo total de necessárias. Ação de contingência Adiar outros compromissos. Requisitar documentação e auxílio de outro programador. Utilizar as cópias dos dados. Responsabili dade Engenheiros Engenheiros Engenheiros 4 Documentação disponível insuficiente Consultar todas fontes disponíveis. Requisitar documentação ao fabricante. Engenheiros 5 Desentendimento entre membros da equipe Cumprir ao máximo o cronograma e comunicação ativa. Reestruturação da equipe. Engenheiros 6 Atraso do cronograma(feriados, férias,falta temporária de recursos) Cumprir o cronograma a risca. Atribuir maior carga horária para execução. Engenheiros

23 8. RESULTADOS 8.1. AVALIAÇÃO DE DESEMPENHO Visando avaliar o desempenho do protótipo foram realizados alguns experimentos, considerando para tal a latência despendida na execução de uma operação no serviço replicado. A latência observada no experimento pode ser dividida em três componentes: c s 1. L com s 2. L exec s c 3. L com que compreende o tempo de envio da requisição pelo cliente; que diz respeito ao tempo de execução da operação no servidor; que corresponde ao tempo de envio da resposta ao cliente. As observações se deram a partir do ambiente do protótipo descrito no tópico Os valores apresentados representam o tempo (em milisegundos) médio necessário para execução de uma operação pelo sistema implementado, de acordo com a instrução executada. Este tempo representa o tempo total transcorrido pela execução de uma operação, que compreende desde a solicitação por parte do cliente, processamento da instrução pelo protótipo e recebimento das respostas ao cliente. A Tabela 1 apresenta a latência média para a execução de uma operação com variações nos comandos SQL, bem como mostra o percentual que cada componente da latência representa no total da execução de uma requisição. Tabela 5. Latências do protótipo implementado Os dados apresentados na Tabela 5 mostram as latências para as operações executadas a partir dos métodos executeupdate e executequery do JDBC. O método executeupdate foi executado para as instruções INSERT, UPDATE e DELETE. A instrução SELECT foi executada através do método executequery. Já a Tabela 6 apresenta os tempos (em milisegundos) para as operações executadas no banco de dados sem o uso do protótipo implementado.

24 Tabela 6. Latências sem o uso de replicação

25 9. CONCLUSÃO A partir dos dados gerados com as avaliações de desempenho, pode-se notar que o custo do serviço replicado é leve em relação ao serviço sem replicação. O trabalho realizado considerou apenas um esquema de replicação com configuração estática, de forma que não foi possível realizar reconfigurações no ambiente quando em execução, no que diz respeito a entrada e retirada de membros faltosos no grupo de servidores. Porém, quanto a este último, o DepSpace possui um mecanismo de verificação quanto a violação de políticas de acesso, de forma que se algum processo viola uma política, este é colocado em uma lista negra para prevenir ações maliciosas futuras. O protótipo implementado mostra que o modelo proposto é viável, de uso prático e com pequenos custos de execução a considerar as atividades de coordenação entre réplicas de serviço, além de prover um sistema robusto e multi-plataforma. Como etapas de desenvolvimento futuro visamos implementar um algoritmo de coleta de lixo e de logging, para entrada de novas máquinas no sistema de servidores.

26 10. REFERÊNCIAS BIBLIOGRÁFICAS [Avizienis et al., 2004] Avizienis, A., Laprie, J.-C., Randell, B., and Landwehr, C. (2004). Basic concepts and taxonomy of dependable and secure computing. IEEE Transactions on Dependable and Secure Computing, 1(1): [Bessani et al., 2007] Bessani, A. N., Alchieri, E., da Silva Fraga, J., and Lung, L. C. (2007). Design and implementation of an intrusion-tolerant tuple space. In Proceedings of the 1st Workshop on Recent Advances on Intrusion-Tolerant Systems WRAITS 07. EuroSys/ACM-SIGOPS. ACM. [Bessani et al., 2006a] Bessani, A. N., Correia, M., da Silva Fraga, J., and Lung, L. C. (2006a). Sharing memory between Byzantine processes using policy enforced tuple spaces. Technical report, Universidade de Lisboa. [Bessani et al., 2006b] Bessani, A. N., Correia, M., da Silva Fraga, J., and Lung, L. C. (2006b). Sharing memory between Byzantine processes using policy- enforced tuple spaces. In Proceedings of 26th IEEE International Conference on Distributed Computing Systems - ICDCS [Cabri et al., 2000] Cabri, G., Leonardi, L., and Zambonelli, F. (2000). Mobile- agent coordination models for internet applications. Computer, 33(2): [Castro and Liskov, 1999] Castro, M. and Liskov, B. (1999). Practical Byzantine fault tolerance. In Proceedings of the 3rd Symposium on Operating Systems Design and Implementation, pages USENIX Association. [Castro and Liskov, 2002] Castro, M. and Liskov, B. (2002). Practical Byzantine faulttolerance and proactive recovery. ACM Transactions Computer Systems, 20(4): [Castro et al., 2003] Castro, M., Rodrigues, R., and Liskov, B. (2003). BASE: Using abstraction to improve fault tolerance. ACM Transactions Computer Systems, 21(3): [Cecchet et al., 2004] Cecchet, E., Marguerite, J., and Zwaenepoel, W. (2004). C- jdbc: Flexible database clustering middleware. In In Proceedings of USENIX Annual Technical Conference, Freenix track. [Correia et al., 2006] Correia, M., Neves, N. F., and Veríssimo, P. (2006). From consensus to atomic broadcast: Time-free Byzantine-resistant protocols without signatures. The Computer Journal, 49(1): [Dwork et al., 1988] Dwork, C., Lynch, N. A., and Stockmeyer, L. (1988). Consensus in the presence of partial synchrony. Journal of ACM, 35(2):

27 [Gashi et al., 2004] Gashi, I., Popov, P., and Strigini, L. (2004). Fault diversity among offthe- shelf sql database servers. In Proceedings of the International Conference on Dependable Systems and Networks - DSN 04. [Gelernter, 1985] Gelernter, D. (1985). Generative communication in Linda. ACM Transactions on Programing Languages and Systems, 7(1): [Guerraoui and Schiper, 1997] Guerraoui, R. and Schiper, A. (1997). Software- based replication for fault tolerance. Computer, 30(4): [Herlihy and Wing, 1990] Herlihy, M. and Wing, J. M. (1990). Linearizability: A correctness condition for concurrent objects. ACM Transactions on Programing Languages and Systems, 12(3): [Lamport, 1978] Lamport, L. (1978). Time, clocks, and the ordering of events in a distributed system. Communications of the ACM, 21(7): [Lamport et al., 1982] Lamport, L., Shostak, R., and Pease, M. (1982). The Byzantine generals problem. ACM Transactions on Programing Languages and Systems, 4(3): [Obelheiro et al., 2005] Obelheiro, R. R., Bessani, A. N., and Lung, L. C. (2005). Analisando a viabilidade da implementação prática de sistemas tolerantes a intrusões. In Anais do V Simpósio Brasileiro em Segurança da Informação e de Sistemas Computacionais - SBSeg [Schneider, 1990] Schneider, F. B. (1990). Implementing fault-tolerant service using the state machine aproach: A tutorial. ACM Computing Surveys, 22(4): [Segall, 1995] Segall, E. J. (1995). Resilient distributed objects: Basic results and applications to shared spaces. In Proceedings of the 7th Symposium on Parallel and Distributed Processing - SPDP 95, pages [Vandiver et al., 2007] Vandiver, B., Balakrishnan, H., Liskov, B., and Madden, S. (2007). Database fault-tolerance with heterogeneous replication. [X , 1992] X , A. (1992). American national standard for information systems-database language-sql. ANSI Standart. [Yin et al., 2003] Yin, J., Martin, J.-P., Venkataramani, A., Alvisi, L., and Dahlin, M. (2003). Separating agreement from execution for Byzantine fault tolerant services. In Proceedings of the 19th ACM Symposium on Operating Systems Principles - SOSP 03, pages

28 ANEXO A

29 CÓDIGOS IMPLEMENTADOS Client.java (classe de simulação de 300 clientes concorrentes) package tuplespace.examples; import tuplespace.jdbc.*; public class Client { public static void main (String[] args) { try { Connection dbconn= DriverTS.getConnection(args[0].trim()); System.out.println("Enviando 1 requisicao"); Statement stmt= dbconn.createstatement(); System.out.println("atualizadas: " + stmt.executeupdate("update teste set nom_teste = 'aldelir' where cod_teste = 1")); System.out.println("atualizadas: " + stmt.executeupdate("delete from teste where nom_teste = 'julia'")); System.out.println("atualizadas: " + stmt.executeupdate("delete from teste where nom_teste = 'fabiana'")); System.out.println("atualizadas: " + stmt.executeupdate("delete from teste where nom_teste = 'adriana'")); System.out.println("atualizadas: " + stmt.executeupdate("insert into teste values (10,'julia')")); System.out.println("atualizadas: " + stmt.executeupdate("insert into teste values (11,'fabiana')")); System.out.println("atualizadas: " + stmt.executeupdate("insert into teste values (12,'adriana')")); System.out.println("Enviando 2 requisicao"); int i=0; while (i < 20) { if (stmt.execute(new String("select * from teste where cod_teste = " + i%10))) System.out.println("execute... true"); else System.out.println("execute... false"); i++; System.out.println("Enviando 3 requisicao"); i=0; while (i < 30) { long start= System.currentTimeMillis(); CachedRowSetTS rs= stmt.executequery("select * from teste where cod_teste < " + i%10 + " order by nom_teste"); System.out.println("Executou em " + (System.currentTimeMillis() - start) + " Milisecs"); while (rs.next()) System.out.println("Registro => codigo: " + rs.getint(1) + ", nome: " + rs.getstring(2)); i++; catch (Exception e) { e.printstacktrace();

30 Connection.java package tuplespace.jdbc; import br.ufsc.das.client.depspaceaccessor; public class Connection { private DepSpaceAccessor spaceaccessor; protected Connection (DepSpaceAccessor spaceaccessor) { this.spaceaccessor= spaceaccessor; public Statement createstatement () { Statement sqlstmt= new Statement(this.spaceAccessor); return (sqlstmt); public PreparedStatement preparestatement (String sqlquery) { PreparedStatement sqlstmt= new PreparedStatement(sqlQuery, this.spaceaccessor); return (sqlstmt); public void close () throws Exception { this.spaceaccessor.finalize(); this.spaceaccessor= null;

31 ReplicationServer.java package tuplespace.dbaccessor; import java.lang.thread; import java.net.inetsocketaddress; import java.io.objectoutputstream; import java.net.socket; import java.util.arraylist; import java.util.properties; import java.sql.statement; import java.sql.connection; import java.sql.drivermanager; import tuplespace.jdbc.exceptionts; import tuplespace.jdbc.cachedrowsetts; import tuplespace.jdbc.serverreply; import tuplespace.utils.hashutils; import tuplespace.utils.configurationparameters; import br.ufsc.das.client.depspaceadmin; import br.ufsc.das.client.depspaceaccessor; import br.ufsc.das.general.context; import br.ufsc.das.general.deptuple; import br.ufsc.das.util.tsconfiguration; import static br.ufsc.das.util.tsutil.dps_name; import static br.ufsc.das.util.tsutil.dps_confideality; public class ReplicationServer { static int serverid, connid; static ConfigurationParameters params; static DepSpaceAccessor space; static Properties spaceproperties; static DepTuple request; static DepTuple template; public static void main (String[] args) { try { Thread.currentThread().setPriority(java.lang.Thread.MIN_PRIORITY); ReplicationServer server= new ReplicationServer(args[0].trim(), Integer.parseInt(args[1].trim())); System.out.println("Conected to DB " + server.params.getvalue("dbname")); connid= 0; while (true) { try { connid++; template= DepTuple.createTuple("CONN", Integer.valueOf(connId)); System.out.println("Waiting for connections: " + template); do { request= space.rd(template); while (request == null); Object[] fields= request.getfields(); Integer clientid= (Integer) fields[1]; ListenConnections threadlisten= new ListenConnections(clientId.intValue(), params, space);

32 catch (Exception inner) { System.out.println("Exception: " + inner.getmessage()); catch (Exception e) { e.printstacktrace(); public ReplicationServer (String spacename, int id) throws Exception { this.serverid= id; this.spaceproperties= new Properties(); this.spaceproperties.put(dps_name, spacename); this.spaceproperties.put(dps_confideality, "true"); this.space= new DepSpaceAdmin().createSpace(spaceProperties); this.params= new ConfigurationParameters(); params.loadparameters("config", "database.config"); class ListenConnections extends Thread { private int clientid, portreply; private boolean connected; private Connection dbconn; private DepSpaceAccessor space; private ArrayList<DepTuple> pendinglist; private DepTuple incomtuple; private CachedRowSetTS rowset; private Integer rows; private Boolean exec; private ConfigurationParameters params; public ListenConnections (int cid, ConfigurationParameters params, DepSpaceAccessor depspace) throws Exception { clientid= cid; connected= true; portreply= cid; space= depspace; Class.forName(params.getValue("driver")).newInstance(); dbconn= DriverManager.getConnection(params.getValue("dburl"),params.getValue("dbuser"),params.getValue("dbpass")); this.setpriority(max_priority); this.start(); public void run () { int reqnum= 0; DepTuple request; while (connected) { try { reqnum++;

33 DepTuple template= DepTuple.createTuple("*", Integer.valueOf(clientId), Integer.valueOf(reqNum), "*", "*", "*", "*"); System.out.println("Aguardando requisicoes..."); System.out.println("Template: " + template); do { request= space.rd(template); while (request == null); connected= executerequest(request); catch (Exception inner) { System.out.println("Exception: " + inner.getmessage()); public boolean executerequest (DepTuple incomtuple) { Object[] fields= incomtuple.getfields(); String tupletype= (String) fields[0]; Integer reqnum= (Integer) fields[2]; String query= (String) fields[3]; String hashquery= (String) fields[4]; Integer method= (Integer) fields[5]; String address= (String) fields[6]; Socket sockreply= null; ServerReply reply= null; System.out.println("Chegou: " + incomtuple.tostring()); try { if (tupletype.equalsignorecase("close")) return false; else { sockreply= new Socket(address, (portreply + reqnum.intvalue())); switch (method.intvalue()) { case 0: { exec= new Boolean(executeStatement(query)); reply= new ServerReply(exec, HashUtils.sha(exec.toString().getBytes())); break; case 1: { case 2: { rows= new Integer(execUpdStatement(query)); reply= new ServerReply(rows, HashUtils.sha(rows.toString().getBytes())); break; rowset= execqrystatement(query, reqnum.intvalue()); reply= new ServerReply(rowSet, HashUtils.sha(query + rowset.size())); break;

34 ObjectOutputStream objout= new ObjectOutputStream(sockReply.getOutputStream()); objout.writeobject(reply); objout.close(); sockreply.close(); System.out.println("Atendeu a requisicao..." + reqnum); return true; catch (Exception e) { e.printstacktrace(); try { if (sockreply == null) sockreply= new Socket(address, ( reqnum.intvalue())); ExceptionTS excp= new ExceptionTS(e.getMessage(), e.getcause()); reply= new ServerReply(excp, HashUtils.sha(excp.toString().getBytes())); ObjectOutputStream objout= new ObjectOutputStream(sockReply.getOutputStream()); objout.writeobject(reply); objout.close(); sockreply.close(); System.out.println("Ocorreu excessao: " + e.getmessage()); return true; catch (Exception in) { in.printstacktrace(); public boolean executestatement (String sqlquery) throws Exception { Statement stmt= dbconn.createstatement(); return (stmt.execute(sqlquery)); public int execupdstatement (String sqlquery) throws Exception { Statement stmt= dbconn.createstatement(); return (stmt.executeupdate(sqlquery)); public CachedRowSetTS execqrystatement (String sqlquery, int reqnum) throws Exception { Statement stmt= dbconn.createstatement(); CachedRowSetTS rowset= new CachedRowSetTS(reqNum); rowset.populate(stmt.executequery(sqlquery)); return (rowset);

35 TSDBServer.java package tuplespace.dbserver; import java.nio.bytebuffer; import java.net.inetsocketaddress; import java.nio.channels.socketchannel; import java.util.arraylist; import java.util.properties; import java.sql.statement; import java.sql.connection; import java.sql.drivermanager; import tuplespace.jdbc.exceptionts; import tuplespace.jdbc.cachedrowsetts; import tuplespace.jdbc.serverreply; import tuplespace.utils.hashutils; import tuplespace.utils.configurationparameters; import br.ufsc.das.client.depspaceadmin; import br.ufsc.das.client.depspaceaccessor; import br.ufsc.das.general.context; import br.ufsc.das.general.deptuple; import br.ufsc.das.util.tsconfiguration; import static br.ufsc.das.util.tsutil.dps_name; import static br.ufsc.das.util.tsutil.dps_confideality; public class TsDBServer { private Connection dbconn; private DepSpaceAccessor space; private Properties spaceproperties; private int serverid; private ArrayList<DepTuple> pendlist; ConfigurationParameters params; public static void main (String[] args) { try { TsDBServer server= new TsDBServer(args[0].trim(), Integer.parseInt(args[1].trim())); System.out.println("Conected to DB " + server.params.getvalue("dbname")); int reqnum= 0; DepTuple request; while (true) { reqnum++; DepTuple template= DepTuple.createTuple("REQUEST", Integer.valueOf(reqNum), "*", "*", "*"); System.out.println("Aguardando requisicoes..."); System.out.println("Template: " + template); request= server.getspace().rd(template); ExecutionServer threadserver= new ExecutionServer(server, request); catch (Exception e) { e.printstacktrace(); public TsDBServer (String spacename, int id) throws Exception {

36 this.serverid= id; this.pendlist= new ArrayList<DepTuple>(); this.spaceproperties= new Properties(); this.spaceproperties.put(dps_name, spacename); this.spaceproperties.put(dps_confideality, "true"); this.space= new DepSpaceAdmin().createSpace(spaceProperties); this.params= new ConfigurationParameters(); this.params.loadparameters("config", "database.config"); Class.forName(params.getValue("driver")).newInstance(); this.dbconn= DriverManager.getConnection(params.getValue("dburl"),params.getValue("dbuser"),params.getValue("dbpass")); public DepSpaceAccessor getspace () { return (this.space); public boolean executestatement (String sqlquery) throws Exception { Statement stmt= dbconn.createstatement(); return (stmt.execute(sqlquery)); public int execupdstatement (String sqlquery) throws Exception { Statement stmt= dbconn.createstatement(); return (stmt.executeupdate(sqlquery)); public CachedRowSetTS execqrystatement (String sqlquery) throws Exception { Statement stmt= dbconn.createstatement(); CachedRowSetTS rowset= new CachedRowSetTS(); rowset.populate(stmt.executequery(sqlquery)); return (rowset); public int getserverid () { return (this.serverid); class ExecutionServer extends Thread { TsDBServer server; DepTuple incomtuple; CachedRowSetTS rowset; Integer rows; Boolean exec; public ExecutionServer (TsDBServer server, DepTuple incom) throws Exception { System.out.println("Chegou requisicao..." + incom); this.server= server;

37 this.incomtuple= incom; this.setpriority(max_priority); this.start(); public void run () { DepTuple response= null; Object[] fields= incomtuple.getfields(); Integer reqnum= (Integer) fields[1]; String query= (String) fields[2]; Integer method= (Integer) fields[3]; String address= (String) fields[4]; int offset= address.indexof(":"); SocketChannel sockchannel; try { sockchannel= SocketChannel.open(); sockchannel.connect(new InetSocketAddress(address.substring(0,offSet),Integer.parseInt(address.substring(offSet+1)))); switch (method.intvalue()) { case 0: { exec= server.executestatement(query); ServerReply reply= new ServerReply(exec, HashUtils.sha(exec.toString().getBytes())); ByteBuffer buffer = ByteBuffer.allocateDirect(reply.getBytes().length); sockchannel.write(buffer.put(reply.getbytes())); sockchannel.close(); break; case 1: { case 2: { rows= server.execupdstatement(query); ServerReply reply= new ServerReply(rows, HashUtils.sha(rows.toString().getBytes())); ByteBuffer buffer = ByteBuffer.allocateDirect(reply.getBytes().length); sockchannel.write(buffer.put(reply.getbytes())); sockchannel.close(); break; rowset= server.execqrystatement(query); ServerReply reply= new ServerReply(rowSet, HashUtils.sha(rowSet.getBytes())); ByteBuffer buffer = ByteBuffer.allocateDirect(reply.getBytes().length); sockchannel.write(buffer.put(reply.getbytes())); sockchannel.close(); break; System.out.println("Atendeu a requisicao..." + reqnum); catch (Exception e) { try { sockchannel= SocketChannel.open(); sockchannel.connect(new InetSocketAddress(address.substring(0,offSet),Integer.parseInt(address.substring(offSet+1))));

38 ExceptionTS excp= new ExceptionTS(e.getMessage(), e.getcause()); ServerReply reply= new ServerReply(rowSet, HashUtils.sha(excp.toString().getBytes())); ByteBuffer buffer = ByteBuffer.allocateDirect(reply.getBytes().length); sockchannel.write(buffer.put(reply.getbytes())); sockchannel.close(); System.out.println("Ocorreu excessao: " + e.getmessage()); catch (Exception in) { in.printstacktrace(); CachedRowSet.java package tuplespace.jdbc; import com.sun.rowset.cachedrowsetimpl; import java.io.bytearrayoutputstream; import java.io.objectoutputstream; public class CachedRowSetTS extends CachedRowSetImpl { String present; public CachedRowSetTS (int request) throws Exception { super(); this.present= ("RowSet:" + request); public String tostring() { return ((this.present.trim() + this.size())); public boolean equals (Object obj) { CachedRowSetTS rowset= (CachedRowSetTS) obj; if (obj instanceof CachedRowSetTS) { if (this.present.equals(rowset.present)) return true; else return false; else return false; public byte[] getbytes () throws Exception { ByteArrayOutputStream bytes= new ByteArrayOutputStream(); ObjectOutputStream objserialized= new ObjectOutputStream(bytes); objserialized.writeobject(this); objserialized.close(); return bytes.tobytearray();

39 DriverTS.java package tuplespace.jdbc; import br.ufsc.das.client.depspaceaccessor; import br.ufsc.das.client.depspaceadmin; import br.ufsc.das.util.tsconfiguration; import java.util.properties; import static br.ufsc.das.util.tsutil.dps_name; import static br.ufsc.das.util.tsutil.dps_confideality; public class DriverTS { public static Connection getconnection (String spaceaccess, int clientid) throws Exception { Properties spaceproperties= new Properties(); spaceproperties.put(dps_name, spaceaccess); spaceproperties.put(dps_confideality, "true"); DepSpaceAccessor spaceaccessor= new DepSpaceAdmin().createAccessor(spaceProperties); Connection conn= new Connection(spaceAccessor, clientid); return (conn); ExceptionTS.java package tuplespace.jdbc; public class ExceptionTS extends Exception { public ExceptionTS (String message, Throwable cause) { super(message, cause); public String tostring () { return this.getmessage(); public boolean equals (Object obj) { ExceptionTS excp= (ExceptionTS) obj; if (obj instanceof ExceptionTS) { if (this.getmessage().equals(excp.getmessage())) return true; else return false; else return false;

40 PreparedStatement.java package tuplespace.jdbc; import br.ufsc.das.client.*; import br.ufsc.das.general.context; import br.ufsc.das.general.deptuple; import br.ufsc.das.util.tsconfiguration; import java.util.properties; import java.util.arraylist; import java.sql.resultset; import static br.ufsc.das.util.tsutil.*; public class PreparedStatement { private DepSpaceAccessor tspace= null; private String sqlquery; private ArrayList sqlparams; private ArrayList paramtypes; // 1 int, 2 float, 3 double, 4 string, 5 bool, 6 date protected PreparedStatement (String sqlquery, DepSpaceAccessor space) { this.sqlquery= sqlquery; this.tspace= space; this.sqlparams= new ArrayList(); this.paramtypes= new ArrayList(); ServerReply.java package tuplespace.jdbc; import java.io.serializable; import java.io.objectinputstream; import java.io.objectoutputstream; import java.io.bytearrayinputstream; import java.io.bytearrayoutputstream; public class ServerReply implements Serializable { private Object dbreply; private String hashvalue; public ServerReply (Object answer, String hash) { this.dbreply= answer; this.hashvalue= hash; public String gethashvalue () { return (this.hashvalue); public Object getdbreply () { return (this.dbreply);

41 public byte[] getbytes () throws Exception { ByteArrayOutputStream bytes= new ByteArrayOutputStream(); ObjectOutputStream objserialized= new ObjectOutputStream(bytes); objserialized.writeobject(this); objserialized.close(); return bytes.tobytearray(); public static ServerReply objfrombytearray (byte[] bytes) throws Exception { ByteArrayInputStream bytearray= new ByteArrayInputStream(bytes); ObjectInputStream objserialized= new ObjectInputStream(byteArray); ServerReply objtmp = (ServerReply) objserialized.readobject(); objserialized.close(); return objtmp; Statement.java package tuplespace.jdbc; import java.net.socket; import java.lang.thread; import java.net.serversocket; import java.net.inetaddress; import java.io.objectinputstream; import tuplespace.utils.hashutils; import tuplespace.utils.consensus; import tuplespace.utils.configurationparameters; import br.ufsc.das.general.deptuple; import br.ufsc.das.util.tsconfiguration; import br.ufsc.das.client.depspaceaccessor; public class Statement { private DepSpaceAccessor tspace= null; private long start=0, end=0; protected Statement (DepSpaceAccessor space) { this.tspace= space; public boolean execute (String sqlquery) throws Exception { int reqnum= inserttuple(sqlquery, 0); Object answer= waitresponse(reqnum); end= System.currentTimeMillis(); System.out.println("Tempo: " + (end-start)); if (isexception(answer)) throw (ExceptionTS) answer; else { Boolean rs= (Boolean) answer;

42 return (rs.booleanvalue()); public int executeupdate (String sqlquery) throws Exception { int reqnum= inserttuple(sqlquery, 1); Object answer= waitresponse(reqnum); end= System.currentTimeMillis(); System.out.println("Tempo: " + (end-start)); if (isexception(answer)) throw (ExceptionTS) answer; else { Integer rs= (Integer) answer; return (rs.intvalue()); public CachedRowSetTS executequery (String sqlquery) throws Exception { int reqnum= inserttuple(sqlquery, 2); Object answer= waitresponse(reqnum); end= System.currentTimeMillis(); System.out.println("Tempo: " + (end-start)); return (rowset); if (isexception(answer)) throw (ExceptionTS) answer; else { CachedRowSetTS rowset= (CachedRowSetTS) answer; private int inserttuple (String sqlquery, int method) throws Exception { int reqnum= 0; String hashvalue= HashUtils.sha(sqlQuery); DepTuple request= null, template= null, returncas= null; do { reqnum++; request= DepTuple.createTuple("REQ", Integer.valueOf(reqNum), sqlquery, hashvalue, Integer.valueOf(method), getlocalhostip()); template= DepTuple.createTuple("REQ", Integer.valueOf(reqNum), "*", "*", "*", "*"); start= System.currentTimeMillis(); returncas= tspace.cas(template, request); while (returncas!= null); return (reqnum); private boolean isexception (Object obj) { if (obj instanceof ExceptionTS)

43 return true; else return false; private Object waitresponse (int offset) { try { ConfigurationParameters params= new ConfigurationParameters(); params.loadparameters("config", "database.config"); int num= 0, numservers= Integer.parseInt(params.getValue("servers")); Consensus agree= new Consensus(numServers); ServerSocket listensock= new ServerSocket(( offset)); TWaitResponse[] threadsreply= new TWaitResponse[numServers]; System.out.println("Esperando " + numservers + " conexoes"); while (num < numservers) { System.out.println("Aguardando conexao"); Socket connectsock= listensock.accept(); System.out.println("Recebeu conexao: " + num); threadsreply[num]= new TWaitResponse(connectSock, agree); num++; System.out.println("Aguardando threads"); for (int i=0; i<numservers; i++) threadsreply[i].join(); System.out.println("Finalizou join"); listensock.close(); System.out.println("Vai decidir"); return (agree.getdecision()); catch (Exception e) { e.printstacktrace(); return null; private String getlocalhostip () { try { return (InetAddress.getLocalHost().getHostAddress().trim()); catch (Exception e) { e.printstacktrace(); return null; class TWaitResponse extends Thread { Consensus agree;

44 Socket connsock; public TWaitResponse (Socket srvsock, Consensus agreement) { this.setpriority(max_priority); this.connsock= srvsock; this.agree= agreement; this.start(); public void run () { try { ObjectInputStream objin= new ObjectInputStream(connSock.getInputStream()); ServerReply resp= (ServerReply) objin.readobject(); objin.close(); agree.putarray(resp); System.out.println("Inseriu valor: " + resp.getdbreply().tostring() + " e hash: " + resp.gethashvalue()); catch (Exception e) { e.printstacktrace(); ConfigurationParameters.java package tuplespace.utils; import java.lang.string; import java.util.hashmap; import java.util.stringtokenizer; import java.io.file; import java.io.filereader; import java.io.bufferedreader; public class ConfigurationParameters { HashMap<String, String> params; public ConfigurationParameters () { params= new HashMap<String, String>(); public void loadparameters (String directory, String configfile) { try { File arq= new File(directory, configfile); BufferedReader buff= new BufferedReader(new FileReader(arq)); if (arq.canread()) { String line; do { line= buff.readline();

45 if (line!=null) if ((!line.startswith("#")) && (!line.equalsignorecase (""))) { StringTokenizer strtok= new StringTokenizer(line,"="); params.put(strtok.nexttoken().trim(), strtok.nexttoken().trim()); while (line!= null); else System.out.println("Arquivo \"" + configfile + "\" nao pode ser lido..."); catch (Exception e) { System.out.println("Arquivo \"" + configfile + "\" nao foi encontrado..."); e.printstacktrace(); public String getvalue (String param) throws Exception { return this.params.get(param.trim()); Consensus.java package tuplespace.utils; import java.lang.string; import tuplespace.jdbc.serverreply; public class Consensus { private int n, c; private String[] votes; private Object[] objs; public Consensus (int num) { this.n= num; this.c= 0; this.votes= new String[n]; this.objs= new Object[n]; public synchronized void putarray (ServerReply value) { votes[c]= value.gethashvalue(); objs[c] = value.getdbreply(); c++; public Object getdecision () { int i; String majority_value= getmajority(); System.out.println("Decidiu por " + majority_value); for (i=0; i<c; i++) { if (votes[i].compareto(majority_value) == 0) {

46 System.out.println("Ja achou em " + i + " o objeto " + objs[i].tostring()); return objs[i]; return null; public String getmajority () { String majority_value = ""; String other_value= ""; int cont_majority= 0; int cont_other= 0; int n= votes.length; int f= 0; if (n % 2 == 0) //if machines are in pair f= (n - 1) / 3; //it means that we use 3f+1 for decide else f= (n - 1) / 2; //otherwise 2f+1 for decide for (int i= 0; i<=n; i++) { //Calculo da maioria por tipo de eleicao if (cont_majority == f + 1) //if achieve majority then stops loop break; else { if (cont_other == f + 1) { majority_value= other_value; break; if (cont_majority!= 0 && votes[i].compareto(majority_value)!= 0) { // returns 0 if is equal other_value= votes[i]; cont_other++; else { if (majority_value.compareto("")== 0) { majority_value= votes[i]; cont_majority++; else cont_majority++; return majority_value;

47 HashUtils.java package tuplespace.utils; import java.util.arrays; import java.security.securerandom; import javax.crypto.mac; import javax.crypto.secretkey; import javax.crypto.keygenerator; import javax.crypto.spec.secretkeyspec; import java.lang.stringbuffer; import java.util.stringtokenizer; import java.security.messagedigest; import java.io.bytearrayoutputstream; public class HashUtils { private static String getstring (byte[] bytes) { StringBuffer sb= new StringBuffer(); for (int i=0; i<bytes.length; i++) { byte b= bytes[i]; sb.append((int)(0x00ff & b)); if (i+1 < bytes.length) sb.append( "-" ); return sb.tostring(); private static byte[] getbytes (String str) { ByteArrayOutputStream bos= new ByteArrayOutputStream(); StringTokenizer st= new StringTokenizer(str, "-", false); while (st.hasmoretokens()) { int i= Integer.parseInt(st.nextToken()); bos.write(( byte )i); return bos.tobytearray(); public static String md5 (String source) { try { MessageDigest md= MessageDigest.getInstance("MD5"); md.reset(); byte[] bytes= md.digest(source.getbytes()); return getstring(bytes); catch (Exception e) { e.printstacktrace(); return null;

48 public static String md5 (byte[] source) { try { MessageDigest md= MessageDigest.getInstance("MD5"); md.reset(); byte[] bytes= md.digest(source); return getstring(bytes); catch (Exception e) { e.printstacktrace(); return null; public static String sha (String source) { try { MessageDigest sha= MessageDigest.getInstance("SHA"); sha.reset(); byte[] bytes= sha.digest(source.getbytes()); return getstring(bytes); catch (Exception e) { e.printstacktrace(); return null; public static String sha (byte[] source) { try { MessageDigest sha= MessageDigest.getInstance("SHA"); sha.reset(); byte[] bytes= sha.digest(source); return getstring(bytes); catch (Exception e) { e.printstacktrace(); return null; public static SecretKey mackeygenerate () { try { SecureRandom sr = new SecureRandom(); byte[] keybytes = new byte[128]; sr.nextbytes(keybytes); SecretKey key = new SecretKeySpec(keyBytes, "RAW"); return key; catch (Exception e) { e.printstacktrace(); return null;

49 public static byte[] hmacsha (SecretKey mackey, byte[] message) { try { Mac hmac= Mac.getInstance("HmacSHA1"); hmac.init(mackey); return (hmac.dofinal(message)); catch (Exception e) { e.printstacktrace(); return null; public static boolean verifyhmac (SecretKey mackey, byte[] message, byte[] msghmac) { try { byte[] recvmac= hmacsha(mackey, message); return (Arrays.equals(recvMac, msghmac)); catch (Exception e) { e.printstacktrace(); return false;

50 ANEXO B JAVADOCS Class Summary CachedRowSetTS Connection DriverTS PreparedStatement ServerReply Statement Exception Summary ExceptionTS C CachedRowSetTS - Class in tuplespace.jdbc CachedRowSetTS(int) - Constructor for class tuplespace.jdbc.cachedrowsetts Client - Class in tuplespace.examples Client() - Constructor for class tuplespace.examples.client close() - Method in class tuplespace.jdbc.connection ConfigurationParameters - Class in tuplespace.utils ConfigurationParameters() - Constructor for class tuplespace.utils.configurationparameters Connection - Class in tuplespace.jdbc Connection(DepSpaceAccessor) - Constructor for class tuplespace.jdbc.connection Consensus - Class in tuplespace.utils Consensus(int) - Constructor for class tuplespace.utils.consensus createstatement() - Method in class tuplespace.jdbc.connection D DriverTS - Class in tuplespace.jdbc DriverTS() - Constructor for class tuplespace.jdbc.driverts

51 E equals(object) - Method in class tuplespace.jdbc.cachedrowsetts equals(object) - Method in exception tuplespace.jdbc.exceptionts ExceptionTS - Exception in tuplespace.jdbc ExceptionTS(String, Throwable) - Constructor for exception tuplespace.jdbc.exceptionts execqrystatement(string) - Method in class tuplespace.dbserver.tsdbserver execupdstatement(string) - Method in class tuplespace.dbserver.tsdbserver execute(string) - Method in class tuplespace.jdbc.statement executequery(string) - Method in class tuplespace.jdbc.statement executestatement(string) - Method in class tuplespace.dbserver.tsdbserver executeupdate(string) - Method in class tuplespace.jdbc.statement G getbytes() - Method in class tuplespace.jdbc.cachedrowsetts getbytes() - Method in class tuplespace.jdbc.serverreply getconnection(string, int) - Static method in class tuplespace.jdbc.driverts getdbreply() - Method in class tuplespace.jdbc.serverreply getdecision() - Method in class tuplespace.utils.consensus gethashvalue() - Method in class tuplespace.jdbc.serverreply getmajority() - Method in class tuplespace.utils.consensus getserverid() - Method in class tuplespace.dbserver.tsdbserver getspace() - Method in class tuplespace.dbserver.tsdbserver getvalue(string) - Method in class tuplespace.utils.configurationparameters H HashUtils - Class in tuplespace.utils HashUtils() - Constructor for class tuplespace.utils.hashutils

52 hmacsha(secretkey, byte[]) - Static method in class tuplespace.utils.hashutils L loadparameters(string, String) - Method in class tuplespace.utils.configurationparameters M mackeygenerate() - Static method in class tuplespace.utils.hashutils main(string[]) - Static method in class tuplespace.dbserver.replicationserver main(string[]) - Static method in class tuplespace.dbserver.tsdbserver main(string[]) - Static method in class tuplespace.examples.client md5(string) - Static method in class tuplespace.utils.hashutils md5(byte[]) - Static method in class tuplespace.utils.hashutils O objfrombytearray(byte[]) - Static method in class tuplespace.jdbc.serverreply P PreparedStatement - Class in tuplespace.jdbc PreparedStatement(String, DepSpaceAccessor) - Constructor for class tuplespace.jdbc.preparedstatement preparestatement(string) - Method in class tuplespace.jdbc.connection putarray(serverreply) - Method in class tuplespace.utils.consensus R ReplicationServer - Class in tuplespace.dbserver ReplicationServer(String, int) - Constructor for class tuplespace.dbserver.replicationserver S ServerReply - Class in tuplespace.jdbc ServerReply(Object, String) - Constructor for class tuplespace.jdbc.serverreply sha(string) - Static method in class tuplespace.utils.hashutils

53 sha(byte[]) - Static method in class tuplespace.utils.hashutils Statement - Class in tuplespace.jdbc Statement(DepSpaceAccessor) - Constructor for class tuplespace.jdbc.statement T tostring() - Method in class tuplespace.jdbc.cachedrowsetts tostring() - Method in exception tuplespace.jdbc.exceptionts TsDBServer - Class in tuplespace.dbserver TsDBServer(String, int) - Constructor for class tuplespace.dbserver.tsdbserver tuplespace.dbserver - package tuplespace.dbserver tuplespace.examples - package tuplespace.examples tuplespace.jdbc - package tuplespace.jdbc tuplespace.utils - package tuplespace.utils V verifyhmac(secretkey, byte[], byte[]) - Static method in class tuplespace.utils.hashutils TUPLESPACE.DBSERVER CLASS REPLICATIONSERVER java.lang.object tuplespace.dbserver.replicationserver public class ReplicationServer extends java.lang.object Constructor Summary ReplicationServer(java.lang.String spacename, int id) Method Summary static void main(java.lang.string[] args) Methods inherited from class java.lang.object

54 clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail ReplicationServer public ReplicationServer(java.lang.String spacename, int id) throws java.lang.exception Throws: java.lang.exception Method Detail main public static void main(java.lang.string[] args) TUPLESPACE.DBSERVER CLASS TSDBSERVER java.lang.object tuplespace.dbserver.tsdbserver public class TsDBServer extends java.lang.object Constructor Summary TsDBServer(java.lang.String spacename, int id) Method Summary CachedRowSetTS execqrystatement(java.lang.string sqlquery) int execupdstatement(java.lang.string sqlquery) boolean executestatement(java.lang.string sqlquery) int getserverid() DepSpaceAccessor getspace() static void main(java.lang.string[] args) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait

55 Constructor Detail TsDBServer public TsDBServer(java.lang.String spacename, int id) throws java.lang.exception Throws: java.lang.exception Method Detail main public static void main(java.lang.string[] args) public DepSpaceAccessor getspace() getspace executestatement public boolean executestatement(java.lang.string sqlquery) throws java.lang.exception Throws: java.lang.exception execupdstatement public int execupdstatement(java.lang.string sqlquery) throws java.lang.exception Throws: java.lang.exception execqrystatement public CachedRowSetTS execqrystatement(java.lang.string sqlquery) throws java.lang.exception Throws: java.lang.exception public int getserverid() getserverid

56 TUPLESPACE.EXAMPLES CLASS CLIENT java.lang.object tuplespace.examples.client public class Client extends java.lang.object Constructor Summary Client() Method Summary static void main(java.lang.string[] args) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail public Client() Method Detail Client main public static void main(java.lang.string[] args)

57 TUPLESPACE.JDBC CLASS CACHEDROWSETTS java.lang.object javax.sql.rowset.baserowset com.sun.rowset.cachedrowsetimpl tuplespace.jdbc.cachedrowsetts All Implemented Interfaces: java.io.serializable, java.lang.cloneable, java.sql.resultset, java.sql.wrapper, javax.sql.rowset, javax.sql.rowset.cachedrowset, javax.sql.rowset.joinable, javax.sql.rowsetinternal public class CachedRowSetTS extends com.sun.rowset.cachedrowsetimpl See Also: Serialized Form Field Summary Fields inherited from class com.sun.rowset.cachedrowsetimpl resbundle Fields inherited from class javax.sql.rowset.baserowset ASCII_STREAM_PARAM, asciistream, BINARY_STREAM_PARAM, binarystream, charstream, UNICODE_STREAM_PARAM, unicodestream Fields inherited from interface javax.sql.rowset.cachedrowset COMMIT_ON_ACCEPT_CHANGES Fields inherited from interface java.sql.resultset CLOSE_CURSORS_AT_COMMIT, CONCUR_READ_ONLY, CONCUR_UPDATABLE, FETCH_FORWARD, FETCH_REVERSE, FETCH_UNKNOWN, HOLD_CURSORS_OVER_COMMIT, TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE Constructor Summary CachedRowSetTS(int request) Method Summary boolean equals(java.lang.object obj) byte[] getbytes() java.lang.string tostring()

58 Methods inherited from class com.sun.rowset.cachedrowsetimpl absolute, acceptchanges, acceptchanges, afterlast, beforefirst, cancelrowupdates, clearwarnings, clone, close, columnupdated, columnupdated, commit, createcopy, createcopynoconstraints, createcopyschema, createshared, deleterow, execute, execute, findcolumn, first, getarray, getarray, getasciistream, getasciistream, getbigdecimal, getbigdecimal, getbigdecimal, getbigdecimal, getbinarystream, getbinarystream, getblob, getblob, getboolean, getboolean, getbyte, getbyte, getbytes, getbytes, getcharacterstream, getcharacterstream, getclob, getclob, getconnection, getcurrentrow, getcursorname, getdate, getdate, getdate, getdate, getdouble, getdouble, getfloat, getfloat, getholdability, getint, getint, getkeycolumns, getlong, getlong, getmatchcolumnindexes, getmatchcolumnnames, getmetadata, getncharacterstream, getncharacterstream, getnclob, getnclob, getnstring, getnstring, getobject, getobject, getobject, getobject, getoriginal, getoriginalrow, getpagesize, getref, getref, getrow, getrowid, getrowid, getrowsetwarnings, getshort, getshort, getsqlxml, getsqlxml, getstatement, getstring, getstring, getsyncprovider, gettablename, gettime, gettime, gettime, gettime, gettimestamp, gettimestamp, gettimestamp, gettimestamp, getunicodestream, getunicodestream, geturl, geturl, getwarnings, insertrow, internalfirst, internallast, internalnext, internalprevious, isafterlast, isbeforefirst, isclosed, isfirst, islast, iswrapperfor, last, movetocurrentrow, movetoinsertrow, next, nextpage, populate, populate, previous, previouspage, readobject, refreshrow, relative, release, removecurrentrow, restoreoriginal, rollback, rollback, rowdeleted, rowinserted, rowsetpopulated, rowupdated, setasciistream, setasciistream, setbigdecimal, setbinarystream, setbinarystream, setblob, setblob, setblob, setblob, setblob, setboolean, setbyte, setbytes, setcharacterstream, setcharacterstream, setclob, setclob, setclob, setclob, setclob, setcommand, setdate, setdate, setdouble, setfloat, setint, setkeycolumns, setlong, setmatchcolumn, setmatchcolumn, setmatchcolumn, setmatchcolumn, setmetadata, setncharacterstream, setncharacterstream, setncharacterstream, setncharacterstream, setnclob, setnclob, setnclob, setnclob, setnclob, setnclob, setnstring, setnstring, setnull, setnull, setobject, setobject, setobject, setoriginal, setoriginalrow, setpagesize, setrowid, setrowid, setrowinserted, setshort, setsqlxml, setsqlxml, setstring, setsyncprovider, settablename, settime, settime, settimestamp, settimestamp, seturl, size, tocollection, tocollection, tocollection, undodelete, undoinsert, undoupdate, unsetmatchcolumn, unsetmatchcolumn, unsetmatchcolumn, unsetmatchcolumn, unwrap, updatearray, updatearray, updateasciistream, updateasciistream, updateasciistream, updateasciistream, updateasciistream, updateasciistream, updatebigdecimal, updatebigdecimal, updatebinarystream, updatebinarystream, updatebinarystream, updatebinarystream, updatebinarystream, updatebinarystream, updateblob, updateblob, updateblob, updateblob, updateblob, updateblob, updateboolean, updateboolean, updatebyte, updatebyte, updatebytes, updatebytes, updatecharacterstream, updatecharacterstream, updatecharacterstream, updatecharacterstream, updatecharacterstream, updatecharacterstream, updateclob, updateclob, updateclob, updateclob, updateclob, updateclob, updatedate, updatedate, updatedouble, updatedouble, updatefloat, updatefloat, updateint, updateint, updatelong, updatelong, updatencharacterstream, updatencharacterstream, updatencharacterstream, updatencharacterstream, updatenclob, updatenclob, updatenclob, updatenclob, updatenclob, updatenclob, updatenstring, updatenstring, updatenull, updatenull, updateobject, updateobject, updateobject, updateobject, updateref, updateref, updaterow, updaterowid, updaterowid, updateshort, updateshort, updatesqlxml, updatesqlxml, updatestring, updatestring, updatetime, updatetime, updatetimestamp, updatetimestamp, wasnull Methods inherited from class javax.sql.rowset.baserowset addrowsetlistener, clearparameters, getcommand, getconcurrency, getdatasourcename, getescapeprocessing, getfetchdirection, getfetchsize, getmaxfieldsize, getmaxrows, getparams, getpassword, getquerytimeout,

59 getshowdeleted, gettransactionisolation, gettype, gettypemap, geturl, getusername, initparams, isreadonly, notifycursormoved, notifyrowchanged, notifyrowsetchanged, removerowsetlistener, setarray, setasciistream, setasciistream, setbigdecimal, setbinarystream, setbinarystream, setblob, setboolean, setbyte, setbytes, setcharacterstream, setcharacterstream, setclob, setconcurrency, setdatasourcename, setdate, setdate, setdouble, setescapeprocessing, setfetchdirection, setfetchsize, setfloat, setint, setlong, setmaxfieldsize, setmaxrows, setnull, setnull, setobject, setobject, setobject, setpassword, setquerytimeout, setreadonly, setref, setshort, setshowdeleted, setstring, settime, settime, settimestamp, settimestamp, settransactionisolation, settype, settypemap, setunicodestream, seturl, setusername Methods inherited from class java.lang.object finalize, getclass, hashcode, notify, notifyall, wait, wait, wait Methods inherited from interface javax.sql.rowsetinternal getparams Methods inherited from interface javax.sql.rowset.cachedrowset getshowdeleted, setshowdeleted Methods inherited from interface javax.sql.rowset addrowsetlistener, clearparameters, getcommand, getdatasourcename, getescapeprocessing, getmaxfieldsize, getmaxrows, getpassword, getquerytimeout, gettransactionisolation, gettypemap, geturl, getusername, isreadonly, removerowsetlistener, setarray, setasciistream, setasciistream, setbigdecimal, setbinarystream, setbinarystream, setblob, setboolean, setbyte, setbytes, setcharacterstream, setcharacterstream, setclob, setconcurrency, setdatasourcename, setdate, setdate, setdouble, setescapeprocessing, setfloat, setint, setlong, setmaxfieldsize, setmaxrows, setnull, setnull, setobject, setobject, setobject, setpassword, setquerytimeout, setreadonly, setref, setshort, setstring, settime, settime, settimestamp, settimestamp, settransactionisolation, settype, settypemap, seturl, setusername Methods inherited from interface java.sql.resultset getconcurrency, getfetchdirection, getfetchsize, gettype, setfetchdirection, setfetchsize Constructor Detail CachedRowSetTS public CachedRowSetTS(int request) throws java.lang.exception Throws: java.lang.exception Method Detail tostring public java.lang.string tostring() Overrides: tostring in class java.lang.object

60 equals public boolean equals(java.lang.object obj) Overrides: equals in class java.lang.object getbytes public byte[] getbytes() throws java.lang.exception Throws: java.lang.exception TUPLESPACE.JDBC CLASS CONNECTION java.lang.object tuplespace.jdbc.connection public class Connection extends java.lang.object Constructor Summary protected Connection(DepSpaceAccessor spaceaccessor) Method Summary void close() Statement createstatement() PreparedStatement preparestatement(java.lang.string sqlquery) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail Connection protected Connection(DepSpaceAccessor spaceaccessor) Method Detail createstatement public Statement createstatement() preparestatement public PreparedStatement preparestatement(java.lang.string sqlquery) public void close() close

61 throws java.lang.exception Throws: java.lang.exception TUPLESPACE.JDBC CLASS DRIVERTS java.lang.object tuplespace.jdbc.driverts public class DriverTS extends java.lang.object Constructor Summary DriverTS() Method Summary static Connection getconnection(java.lang.string spaceaccess, int clientid) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail public DriverTS() Method Detail DriverTS getconnection public static Connection getconnection(java.lang.string spaceaccess, int clientid) throws java.lang.exception Throws: java.lang.exception

62 TUPLESPACE.JDBC CLASS PREPAREDSTATEMENT java.lang.object tuplespace.jdbc.preparedstatement public class PreparedStatement extends java.lang.object Constructor Summary protected PreparedStatement(java.lang.String sqlquery, DepSpaceAccessor space) Method Summary Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail PreparedStatement protected PreparedStatement(java.lang.String sqlquery, DepSpaceAccessor space) TUPLESPACE.JDBC CLASS SERVERREPLY java.lang.object tuplespace.jdbc.serverreply All Implemented Interfaces: java.io.serializable public class ServerReply extends java.lang.object implements java.io.serializable See Also: Serialized Form Constructor Summary ServerReply(java.lang.Object answer, java.lang.string hash) Method Summary byte[] getbytes()

63 java.lang.object getdbreply() java.lang.string gethashvalue() static ServerReply objfrombytearray(byte[] bytes) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail ServerReply public ServerReply(java.lang.Object answer, java.lang.string hash) Method Detail gethashvalue public java.lang.string gethashvalue() getdbreply public java.lang.object getdbreply() getbytes public byte[] getbytes() throws java.lang.exception Throws: java.lang.exception objfrombytearray public static ServerReply objfrombytearray(byte[] bytes) throws java.lang.exception Throws: java.lang.exception TUPLESPACE.JDBC CLASS STATEMENT java.lang.object tuplespace.jdbc.statement public class Statement extends java.lang.object Constructor Summary protected Statement(DepSpaceAccessor space) Method Summary

64 boolean execute(java.lang.string sqlquery) CachedRowSetTS executequery(java.lang.string sqlquery) int executeupdate(java.lang.string sqlquery) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail Statement protected Statement(DepSpaceAccessor space) Method Detail execute public boolean execute(java.lang.string sqlquery) throws java.lang.exception Throws: java.lang.exception executeupdate public int executeupdate(java.lang.string sqlquery) throws java.lang.exception Throws: java.lang.exception executequery public CachedRowSetTS executequery(java.lang.string sqlquery) throws java.lang.exception Throws: java.lang.exception TUPLESPACE.JDBC CLASS EXCEPTIONTS java.lang.object java.lang.throwable java.lang.exception tuplespace.jdbc.exceptionts All Implemented Interfaces: java.io.serializable public class ExceptionTS extends java.lang.exception See Also: Serialized Form Constructor Summary

65 ExceptionTS(java.lang.String message, java.lang.throwable cause) Method Summary boolean equals(java.lang.object obj) java.lang.string tostring() Methods inherited from class java.lang.throwable fillinstacktrace, getcause, getlocalizedmessage, getmessage, getstacktrace, initcause, printstacktrace, printstacktrace, printstacktrace, setstacktrace Methods inherited from class java.lang.object clone, finalize, getclass, hashcode, notify, notifyall, wait, wait, wait Constructor Detail ExceptionTS public ExceptionTS(java.lang.String message, java.lang.throwable cause) Method Detail tostring public java.lang.string tostring() Overrides: tostring in class java.lang.throwable equals public boolean equals(java.lang.object obj) Overrides: equals in class java.lang.object TUPLESPACE.UTILS CLASS CONFIGURATIONPARAMETERS java.lang.object tuplespace.utils.configurationparameters public class ConfigurationParameters extends java.lang.object Constructor Summary ConfigurationParameters() Method Summary java.lang.string getvalue(java.lang.string param)

66 void loadparameters(java.lang.string directory, java.lang.string configfile) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail ConfigurationParameters public ConfigurationParameters() Method Detail loadparameters public void loadparameters(java.lang.string directory, java.lang.string configfile) getvalue public java.lang.string getvalue(java.lang.string param) throws java.lang.exception Throws: java.lang.exception TUPLESPACE.UTILS CLASS CONSENSUS java.lang.object tuplespace.utils.consensus public class Consensus extends java.lang.object Constructor Summary Consensus(int num) Method Summary java.lang.object getdecision() java.lang.string getmajority() void putarray(serverreply value) Methods inherited from class java.lang.object clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait

67 Constructor Detail public Consensus(int num) Method Detail Consensus putarray public void putarray(serverreply value) getdecision public java.lang.object getdecision() getmajority public java.lang.string getmajority() TUPLESPACE.UTILS CLASS HASHUTILS java.lang.object tuplespace.utils.hashutils public class HashUtils extends java.lang.object Constructor Summary HashUtils() Method Summary static byte[] hmacsha(javax.crypto.secretkey mackey, byte[] message) static javax.crypto.secretkey mackeygenerate() static java.lang.string md5(byte[] source) static java.lang.string md5(java.lang.string source) static java.lang.string sha(byte[] source) static java.lang.string sha(java.lang.string source) static boolean verifyhmac(javax.crypto.secretkey mackey, byte[] message, byte[] msghmac) Methods inherited from class java.lang.object

68 clone, equals, finalize, getclass, hashcode, notify, notifyall, tostring, wait, wait, wait Constructor Detail public HashUtils() Method Detail HashUtils md5 public static java.lang.string md5(java.lang.string source) md5 public static java.lang.string md5(byte[] source) sha public static java.lang.string sha(java.lang.string source) sha public static java.lang.string sha(byte[] source) mackeygenerate public static javax.crypto.secretkey mackeygenerate() hmacsha public static byte[] hmacsha(javax.crypto.secretkey mackey, byte[] message) verifyhmac public static boolean verifyhmac(javax.crypto.secretkey mackey, byte[] message, byte[] msghmac)

69 ANEXO C TELAS DE EXECUÇÃO Figura 7. Servidores atendendo requisição do cliente Figura 8. Cliente recebendo respostas e comparando hashes

70 Figura 9. Cliente imprimindo resposta equivalente ao hash decidido pelo consenso Figura 10. Cliente pode enviar mais de uma requisição

REPEATS - Uma Arquitetura para Replicação Tolerante a Faltas Bizantinas baseada em Espaço de Tuplas

REPEATS - Uma Arquitetura para Replicação Tolerante a Faltas Bizantinas baseada em Espaço de Tuplas 26 Simpósio Brasileiro de Redes de Computadores e Sistemas Distribuídos 945 REPEATS - Uma Arquitetura para Replicação Tolerante a Faltas Bizantinas baseada em Espaço de Tuplas Aldelir Fernando Luiz 1,

Leia mais

Programação com Acesso a Banco de Dados

Programação com Acesso a Banco de Dados Campus Ipanguaçu Curso: Técnico em Informática Programação com Acesso a Banco de Dados AULA 17 ACESSO A BANCO DE DADOS COM JDBC PROF.: CLAYTON M. COSTA 2 011.2 Introdução Aplicação + Banco de Dados: Funcionalidade

Leia mais

Acesso a Bancos de Dados em Java (JDBC)

Acesso a Bancos de Dados em Java (JDBC) Acesso a Bancos de Dados em Java (JDBC) Jomi Fred Hübner Universidade Regional de Blumenau Departamento de Sistemas e Computação Roteiro Introdução Objetivo da JDBC Vantagens Visão geral do acesso a SGBDs

Leia mais

JDBC Acessando Banco de Dados

JDBC Acessando Banco de Dados Acessando Banco de Dados Objetivos Entender o que são Drivers. Diferenciar ODBC, JDBC e DRIVERMANAGER. Desenvolver uma aplicação Java para conexão com Banco de Dados. Criar um objeto a partir da classe

Leia mais

Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia

Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia Sistemas de Informação Ling.Prog.V Prof. Roberto Couto Lima Fonte: Curso Java Prof. Fabricio Leonard Leopoldino (Universo)

Leia mais

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC Java Database Connectivity Provê acesso SQL ao banco de dados Principais

Leia mais

INTRODUÇÃO. No entanto, o que pode ser considerado um produto (resultado) da criação de BDs?

INTRODUÇÃO. No entanto, o que pode ser considerado um produto (resultado) da criação de BDs? BANCO DE DADOS Universidade do Estado de Santa Catarina Centro de Ciências Tecnológicas Departamento de Ciência da Computação Prof. Alexandre Veloso de Matos alexandre.matos@udesc.br INTRODUÇÃO Um Banco

Leia mais

Programação Orientada a Objetos JDBC Java Database Connectivity

Programação Orientada a Objetos JDBC Java Database Connectivity Especialização em Engenharia de Software Programação Orientada a Objetos JDBC Java Database Connectivity Sérgio Soares scbs@cin.ufpe.br Objetivos Apresentar os conceitos básicos da especificação de Java

Leia mais

Prof. Marcelo de Sá Barbosa SISTEMAS DISTRIBUIDOS

Prof. Marcelo de Sá Barbosa SISTEMAS DISTRIBUIDOS Prof. Marcelo de Sá Barbosa SISTEMAS DISTRIBUIDOS Objetos distribuídos e invocação remota Introdução Comunicação entre objetos distribuídos Chamada de procedimento remoto Eventos e notificações Objetos

Leia mais

Java na WEB Banco de Dados

Java na WEB Banco de Dados 1 Java na WEB Banco de Dados Objetivo: Ao final da aula o aluno será capaz de: Criar aplicações JSP com acesso ao Banco de Dados MySql Configurar o TomCat para acessar o MySql. Não é Objetivo: Ao final

Leia mais

JDBC. Prof. Márcio Bueno (poonoite@marciobueno.com)

JDBC. Prof. Márcio Bueno (poonoite@marciobueno.com) JDBC Prof. Márcio Bueno (poonoite@marciobueno.com) JBDC Java Database Connectivity ou JDBC é um conjunto de classes e interfaces (API) escritas em Java que faz o envio de instruções SQL para qualquer banco

Leia mais

Banco de Dados. Banco de Dados. Alcides Pamplona alcides.pamplona@gmail.com. Alcides Pamplona Linguagem de Programação CESBD 2010

Banco de Dados. Banco de Dados. Alcides Pamplona alcides.pamplona@gmail.com. Alcides Pamplona Linguagem de Programação CESBD 2010 Alcides Pamplona Linguagem de Programação CESBD 2010 Alcides Pamplona alcides.pamplona@gmail.com Tópicos API JDBC Utilizando JDBC Statement PreparedStatement Mapeamento Objeto-Relacional 2 API JDBC 3 API

Leia mais

Integrando Java com Banco de Dados

Integrando Java com Banco de Dados Especialização em Engenharia de Software Programação Orientada a Objetos JDBC Java Database Connectivity Sérgio Soares scbs@cin.ufpe.br Objetivos Apresentar os conceitos básicos da especificação de Java

Leia mais

Programação Orientada a Objetos (DPADF 0063)

Programação Orientada a Objetos (DPADF 0063) Programação Orientada a Objetos (DPADF 0063) Aula 9 JDBC (Java Database Connectivity) Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas

Leia mais

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015 Manipulação de Banco de Dados com Java Ms. Bruno Crestani Calegaro (bruno.calegaro@ifsc.edu.br) Maio/ 2015 Acesso a um SGBD Em sistemas mais simples o uso de arquivos pode ser usado mas para aplicações

Leia mais

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br

Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados. Prof. Josenildo Silva jcsilva@ifma.edu.br Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados Prof. Josenildo Silva jcsilva@ifma.edu.br Introdução O JDBC (Java Database Connectivity) foi criado com o intuito de fornecer aos programadores

Leia mais

Visão do Usuário da DSM

Visão do Usuário da DSM Memória Compartilhada Distribuída Visão Geral Implementação Produtos 1 Memória Compartilhada Distribuída Mecanismos tradicionais de comunicação via RPC/RMI ou mensagens deixam explícitas as interações

Leia mais

Aula 1 Acesso a Banco de Dados

Aula 1 Acesso a Banco de Dados Laboratório de Banco de Dados Aula 1 Acesso a Banco de Dados Prof. Josenildo Silva jcsilva@ifma.edu.br Introdução O JDBC (Java Database Connectivity) foi criado com o intuito de fornecer aos programadores

Leia mais

Banco de Dados. Prof. Leonardo Barreto Campos 1

Banco de Dados. Prof. Leonardo Barreto Campos 1 Banco de Dados Prof. Leonardo Barreto Campos 1 Sumário Introdução; Banco de Dados Relacionais; SQL; MySQL; Manipulando Banco de Dados com o JDBC; Bibliografia; Prof. Leonardo Barreto Campos 2/25 Introdução

Leia mais

Notas da Aula 15 - Fundamentos de Sistemas Operacionais

Notas da Aula 15 - Fundamentos de Sistemas Operacionais Notas da Aula 15 - Fundamentos de Sistemas Operacionais 1. Software de Entrada e Saída: Visão Geral Uma das tarefas do Sistema Operacional é simplificar o acesso aos dispositivos de hardware pelos processos

Leia mais

(UFF) JDBC (I) TEPIS II

(UFF) JDBC (I) TEPIS II Aula 20: JDBC (I) Diego Passos Universidade Federal Fluminense Técnicas de Projeto e Implementação de Sistemas II Diego Passos (UFF) JDBC (I) TEPIS II 1 / 33 JDBC: Introdução Especificação que provê acesso

Leia mais

Provendo Confidencialidade em Espaços de Tuplas Tolerantes a Intrusões

Provendo Confidencialidade em Espaços de Tuplas Tolerantes a Intrusões Provendo Confidencialidade em Espaços de Tuplas Tolerantes a Intrusões Alysson Neves Bessani 1, Eduardo Adílio Pelison Alchieri 1, Miguel Correia 2, Joni da Silva Fraga 1, Lau Cheuk Lung 3 1 DAS, PGEEL,

Leia mais

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. JDBC - Java Database Connectivity A,L,F,M

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. JDBC - Java Database Connectivity A,L,F,M JAVA Marcio de Carvalho Victorino 1 JDBC - Java Database Connectivity 2 1 JDBC conceito JDBC é uma API (Application Program Interface) para acesso a SGBD s (Sistemas Gerenciadores de Banco de Dados) relacionais

Leia mais

Acessando bancos de dados com o JDBC

Acessando bancos de dados com o JDBC Acessando bancos de dados com o JDBC Notas de Aula: Java Como Programar, 8/E Prof. Geraldo Braz Junior Introdução Um banco de dados é uma coleção organizada de dados. Um sistema de gerenciamento de bancos

Leia mais

Introdução a Threads Java

Introdução a Threads Java Introdução a Threads Java Prof. Gerson Geraldo Homrich Cavalheiro Universidade Federal de Pelotas Departamento de Informática Instituto de Física e Matemática Pelotas RS Brasil http://gersonc.anahy.org

Leia mais

Banco de Dados. Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com

Banco de Dados. Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com Banco de Dados Sérgio Luiz Ruivace Cerqueira sergioruivace@gmail.com Roteiro Mapeamento de objetos para modelo relacional Estratégias de persistência Persistência JDBC Mapeando Objetos para o Modelo Relacional

Leia mais

Notas da Aula 4 - Fundamentos de Sistemas Operacionais

Notas da Aula 4 - Fundamentos de Sistemas Operacionais Notas da Aula 4 - Fundamentos de Sistemas Operacionais 1. Threads Threads são linhas de execução dentro de um processo. Quando um processo é criado, ele tem uma única linha de execução, ou thread. Esta

Leia mais

Exemplos práticos do uso de RMI em sistemas distribuídos

Exemplos práticos do uso de RMI em sistemas distribuídos Exemplos práticos do uso de RMI em sistemas distribuídos Elder de Macedo Rodrigues, Guilherme Montez Guindani, Leonardo Albernaz Amaral 1 Fábio Delamare 2 Pontifícia Universidade Católica do Rio Grande

Leia mais

Leonardo Gresta Paulino Murta leomurta@gmail.com

Leonardo Gresta Paulino Murta leomurta@gmail.com Leonardo Gresta Paulino Murta leomurta@gmail.com O Que é JDBC? API de acesso a banco de dados relacional do Java Faz uso do driver provido pelo banco de dados Roda SQL (create, insert, update, etc.) no

Leia mais

Considerações no Projeto de Sistemas Cliente/Servidor

Considerações no Projeto de Sistemas Cliente/Servidor Cliente/Servidor Desenvolvimento de Sistemas Graça Bressan Graça Bressan/LARC 2000 1 Desenvolvimento de Sistemas Cliente/Servidor As metodologias clássicas, tradicional ou orientada a objeto, são aplicáveis

Leia mais

Arquitetura de Sistemas Distribuídos. Introdução a Sistemas Distribuídos

Arquitetura de Sistemas Distribuídos. Introdução a Sistemas Distribuídos Introdução a Sistemas Distribuídos Definição: "Um sistema distribuído é uma coleção de computadores autônomos conectados por uma rede e equipados com um sistema de software distribuído." "Um sistema distribuído

Leia mais

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha http://www.materialdeaula.com.br

Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha http://www.materialdeaula.com.br Programação WEB (JSP + Banco Dados) Eng. Computação Prof. Rodrigo Rocha http://www.materialdeaula.com.br JSP (Java Server Pages) - JavaServer Pages (JSP) - Tecnologia de programação serverside - Permite

Leia mais

Distributed Systems Principles and Paradigms

Distributed Systems Principles and Paradigms Distributed Systems Principles and Paradigms Maarten van Steen VU Amsterdam, Dept. Computer Science (Tradução e Adaptação Ricardo Anido - IC/Unicamp) Capítulo 04: Comunicação Versão: 20 de março de 2014

Leia mais

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064

Sistemas Distribuídos. Professora: Ana Paula Couto DCC 064 Sistemas Distribuídos Professora: Ana Paula Couto DCC 064 Processos- Clientes, Servidores, Migração Capítulo 3 Agenda Clientes Interfaces de usuário em rede Sistema X Window Software do lado cliente para

Leia mais

Sistemas Distribuídos

Sistemas Distribuídos Sistemas Distribuídos Modelo Cliente-Servidor: Introdução aos tipos de servidores e clientes Prof. MSc. Hugo Souza Iniciando o módulo 03 da primeira unidade, iremos abordar sobre o Modelo Cliente-Servidor

Leia mais

Java : Comunicação Cliente-Servidor.

Java : Comunicação Cliente-Servidor. Java : Comunicação Cliente-Servidor. Objetivo: Capacitar o aluno a desenvolver uma aplicação servidora para múltiplos clientes. Apresentar as classes Socket e ServerSocket, classes de fluxo de dados, a

Leia mais

Manipulação de Banco de Dados com Java 1. Objetivos

Manipulação de Banco de Dados com Java 1. Objetivos Manipulação de Banco de Dados com Java 1. Objetivos Demonstrar os fundamentos básicos para a manipulação de banco de dados com Java; Apresentar a sintaxe de comandos SQL usados em Java. 2. Definições A

Leia mais

Acesso a Bancos de Dados (JDBC) Autor: Cleyton Maciel (clayton.maciel@ifrn.edu.br) Adaptação: Pedro Baesse (pedro.baesse@ifrn.edu.

Acesso a Bancos de Dados (JDBC) Autor: Cleyton Maciel (clayton.maciel@ifrn.edu.br) Adaptação: Pedro Baesse (pedro.baesse@ifrn.edu. Acesso a Bancos de Dados (JDBC) Autor: Cleyton Maciel (clayton.maciel@ifrn.edu.br) Adaptação: Pedro Baesse (pedro.baesse@ifrn.edu.br) JDBC Conceito Tipos Transações Tipos SQL e JAVA Conexão JDBC Implementação

Leia mais

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos. JDBC CRIANDO O BANCO DE DADOS: Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos. CRIANDO O PROJETO JAVA PARA DESKTOP: Crie um projeto Java chamado Prograd Crie um pacote chamado

Leia mais

JPA: Persistência padronizada em Java

JPA: Persistência padronizada em Java JPA: Persistência padronizada em Java FLÁVIO HENRIQUE CURTE Bacharel em Engenharia de Computação flaviocurte.java@gmail.com Programação Orientada a Objetos X Banco de Dados Relacionais = Paradigmas diferentes

Leia mais

Towards Secure and Dependable Software-Defined Networks. Carlos Henrique Zilves Nicodemus

Towards Secure and Dependable Software-Defined Networks. Carlos Henrique Zilves Nicodemus Towards Secure and Dependable Software-Defined Networks Carlos Henrique Zilves Nicodemus Sumário Introdução Vetores de Ameaças Segurança e Confiabilidade em SDN Exemplo de Design Trabalhos Relacionados

Leia mais

JDBC Java Database Connectivity

JDBC Java Database Connectivity 5 JDBC Java Database Connectivity Prof. Autor: Daniel Morais dos Reis e-tec Brasil Programação Avançada Para Web Página1 Meta Trabalhar com bancos de dados em aplicações web em JSP através das classes

Leia mais

UNIVERSIDADE. Sistemas Distribuídos

UNIVERSIDADE. Sistemas Distribuídos UNIVERSIDADE Sistemas Distribuídos Ciência da Computação Prof. Jesus José de Oliveira Neto Comunicação Inter-Processos Sockets e Portas Introdução Sistemas distribuídos consistem da comunicação entre processos

Leia mais

Aula 30 - Sockets em Java

Aula 30 - Sockets em Java Aula 30 - Sockets em Java Sockets Sockets são estruturas que permitem que funções de software se interconectem. O conceito é o mesmo de um soquete (elétrico, telefônico, etc...), que serve para interconectar

Leia mais

Disciplina: Sistemas Operacionais - CAFW-UFSM Professor: Roberto Franciscatto

Disciplina: Sistemas Operacionais - CAFW-UFSM Professor: Roberto Franciscatto Disciplina: Sistemas Operacionais - CAFW-UFSM Professor: Roberto Franciscatto Introdução Processo cooperativo é aquele que pode afetar outros processos em execução no sistema Ou ser por eles afetado Processos

Leia mais

OBJETOS DISTRIBUÍDOS E INVOCAÇÃO REMOTA

OBJETOS DISTRIBUÍDOS E INVOCAÇÃO REMOTA OBJETOS DISTRIBUÍDOS E INVOCAÇÃO REMOTA SUMÁRIO Introdução Comunicação entre objetos distribuídos Eventos e Notificações 1.INTRODUÇÃO Middleware oferece: Transparência de localização Independência de protocolos

Leia mais

Roteiro. Arquitetura. Tipos de Arquitetura. Questionário. Centralizado Descentralizado Hibrido

Roteiro. Arquitetura. Tipos de Arquitetura. Questionário. Centralizado Descentralizado Hibrido Arquitetura Roteiro Arquitetura Tipos de Arquitetura Centralizado Descentralizado Hibrido Questionário 2 Arquitetura Figura 1: Planta baixa de uma casa 3 Arquitetura Engenharia de Software A arquitetura

Leia mais

Programação Concorrente Processos e Threads

Programação Concorrente Processos e Threads Programação Concorrente Processos e Threads Prof. Eduardo Alchieri Processos O conceito mais central em qualquer sistema operacional é o processo Uma abstração de um programa em execução Um programa por

Leia mais

Persistência de Classes em Tabelas de Banco de Dados

Persistência de Classes em Tabelas de Banco de Dados UTFPR DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). 1 Persistência de Classes em Tabelas de Banco de Dados 1) Introdução! Em algumas situações, pode ser necessário preservar os objetos

Leia mais

Threads e Sockets em Java. Threads em Java. Programas e Processos

Threads e Sockets em Java. Threads em Java. Programas e Processos Threads em Java Programas e Processos Um programa é um conceito estático, isto é, um programa é um arquivo em disco que contém um código executável por uma CPU. Quando este programa é executado dizemos

Leia mais

Banco de Dados. Prof. Dr. Rogério Galante Negri

Banco de Dados. Prof. Dr. Rogério Galante Negri Banco de Dados Prof Dr Rogério Galante Negri Tradicionalmente O armazenamento dos dados utilizava arquivos individuais, sem nenhum relacionamento Cada programa utilizava seu próprio sistema de arquivo

Leia mais

SISTEMA COMPUTACIONAL PARA ANÁLISES DE DADOS EM AGRICULTURA DE PRECISÃO

SISTEMA COMPUTACIONAL PARA ANÁLISES DE DADOS EM AGRICULTURA DE PRECISÃO UNIVERSIDADE FEDERAL RURAL DO RIO DE JANEIRO INSTITUTO DE TECNOLOGIA DEPARTAMENTO DE ENGENHARIA PROJETO SISTEMA COMPUTACIONAL PARA ANÁLISES DE DADOS EM AGRICULTURA DE PRECISÃO ALUNO RICARDO CARDOSO TERZELLA

Leia mais

Java JDBC - I. Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em http://msdn.microsoft.com/en-us/data/aa937724.

Java JDBC - I. Ex. 2: para o SQLServer da Microsoft, o driver JDBC pode ser obtido em http://msdn.microsoft.com/en-us/data/aa937724. Curso de Análise e Desenvolvimento de Software Disciplina: Linguagens de Programação II Prof. Gilmar Caiado Material de Apoio Java JDBC I 3 o Período 22/05/2009 Java JDBC - I Motivação: Realizar a integração

Leia mais

Desenvolvimento de Sistemas Orientados a Objetos com UML UP/RUP: Projeto

Desenvolvimento de Sistemas Orientados a Objetos com UML UP/RUP: Projeto Desenvolvimento de Sistemas Orientados a Objetos com UML UP/RUP: Projeto Engenharia de Software I Informática 2009 Profa. Dra. Itana Gimenes RUP: Artefatos de projeto Modelo de Projeto: Use-Case Realization-projeto

Leia mais

Sistemas Operacionais

Sistemas Operacionais UNIVERSIDADE BANDEIRANTE DE SÃO PAULO INSTITUTO POLITÉCNICO CURSO DE SISTEMAS DE INFORMAÇÃO Sistemas Operacionais Notas de Aulas: Tópicos 7 e 8 Estrutura do Sistema Operacional São Paulo 2009 1 Sumário

Leia mais

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos Descrição Implemente nesta atividade de laboratório um programa em Java utilizando threads

Leia mais

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB) Uma Introdução à Arquitetura Francisco C. R. Reverbel 1 Copyright 1998-2006 Francisco Reverbel O Object Request Broker (ORB) Via de comunicação entre objetos (object bus), na arquitetura do OMG Definido

Leia mais

Programa de Computador que funciona em Rede

Programa de Computador que funciona em Rede Programa de Computador que funciona em Rede professor Robinson Vida Noronha 1 Paradigma Um programa rodando em rede é como uma loja. 2 Uma loja é composta por Vendedores Vendedores 3 Um loja deve servir

Leia mais

Concretização de um protocolo de difusão atómica em sistemas com ligações intermitentes

Concretização de um protocolo de difusão atómica em sistemas com ligações intermitentes Concretização de um protocolo de difusão atómica em sistemas com ligações intermitentes Sérgio Cardoso Escola Sup. Gestão de Santarém Politécnico de Santarém s.cardoso@mail.telepac.pt Luís Rodrigues Faculdade

Leia mais

Padrões de Projeto e Persistência com DAO

Padrões de Projeto e Persistência com DAO Curso de Análise de Sistemas Análise de Sistemas II Padrões de Projeto e Persistência com DAO Prof. Giuliano Prado de Morais Giglio, M.Sc. Introdução a Padrões de Projeto Padrões de Projeto foram inicialmente

Leia mais

SISTEMAS DISTRIBUIDOS

SISTEMAS DISTRIBUIDOS 1 2 Caracterização de Sistemas Distribuídos: Os sistemas distribuídos estão em toda parte. A Internet permite que usuários de todo o mundo acessem seus serviços onde quer que possam estar. Cada organização

Leia mais

JavaScript 2.0X 1.0 3.0X 1.1 4.0 4.05 1.2 4.06 4.61 1.3 5.0 1.4 6.0 1.5

JavaScript 2.0X 1.0 3.0X 1.1 4.0 4.05 1.2 4.06 4.61 1.3 5.0 1.4 6.0 1.5 JavaScript Diego R. Frank, Leonardo Seibt FIT Faculdades de Informática de Taquara Fundação Educacional Encosta Inferior do Nordeste Av. Oscar Martins Rangel, 4500 Taquara RS Brasil difrank@terra.com.br,

Leia mais

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel Acesso a Banco Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel As conexões em Java são feitas através de uma ponte que implementa todas as funcionalidades que um banco de dados padrão deve

Leia mais

Sistemas Distribuídos: Conceitos e Projeto Introdução a Tolerância a Falhas

Sistemas Distribuídos: Conceitos e Projeto Introdução a Tolerância a Falhas Sistemas Distribuídos: Conceitos e Projeto Introdução a Tolerância a Falhas Francisco José da Silva e Silva Laboratório de Sistemas Distribuídos (LSD) Departamento de Informática / UFMA http://www.lsd.ufma.br

Leia mais

SISTEMAS OPERACIONAIS. Apostila 03 Estrutura do Sistema Operacional UNIBAN

SISTEMAS OPERACIONAIS. Apostila 03 Estrutura do Sistema Operacional UNIBAN SISTEMAS OPERACIONAIS Apostila 03 Estrutura do Sistema Operacional UNIBAN 1.0 O Sistema Operacional como uma Máquina Virtual A arquitetura (conjunto de instruções, organização de memória, E/S e estrutura

Leia mais

Apostila de Gerenciamento e Administração de Redes

Apostila de Gerenciamento e Administração de Redes Apostila de Gerenciamento e Administração de Redes 1. Necessidades de Gerenciamento Por menor e mais simples que seja uma rede de computadores, precisa ser gerenciada, a fim de garantir, aos seus usuários,

Leia mais

Java. Marcio de Carvalho Victorino www.dominandoti.eng.br

Java. Marcio de Carvalho Victorino www.dominandoti.eng.br Java Marcio de Carvalho Victorino www.dominandoti.eng.br 3. Considere as instruções Java abaixo: int cont1 = 3; int cont2 = 2; int cont3 = 1; cont1 += cont3++; cont1 -= --cont2; cont3 = cont2++; Após a

Leia mais

Autenticação e Autorização

Autenticação e Autorização Autenticação e Autorização Introdução A segurança em aplicações corporativas está relacionada a diversos aspectos, tais como: autenticação, autorização e auditoria. A autenticação identifica quem acessa

Leia mais

Curso de Aprendizado Industrial Desenvolvedor WEB

Curso de Aprendizado Industrial Desenvolvedor WEB Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos II Professor: Cheli dos S. Mendes da Costa Modelo Cliente- Servidor Modelo de Aplicação Cliente-servidor Os

Leia mais

SQL BANCO DE DADOS. Linguagem de consulta SQL. Linguagem de consulta SQL. Linguagem de Consulta Estruturada

SQL BANCO DE DADOS. Linguagem de consulta SQL. Linguagem de consulta SQL. Linguagem de Consulta Estruturada Revisão de tpicos anteriores BANCO DE DADOS Linguagem de consulta SQL Roberto Duarte Fontes Brasília - DF roberto@fontes.pro.br Projeto de banco de dados Modelagem Conceitual (independe da implementação)

Leia mais

CAPITULO 4 A ARQUITETURA LÓGICA PARA O AMBIENTE

CAPITULO 4 A ARQUITETURA LÓGICA PARA O AMBIENTE CAPITULO 4 A ARQUITETURA LÓGICA PARA O AMBIENTE A proposta para o ambiente apresentada neste trabalho é baseada no conjunto de requisitos levantados no capítulo anterior. Este levantamento, sugere uma

Leia mais

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Prof. MSc. Hugo Souza Iniciando nossas aulas sobre

Leia mais

Sistemas Distribuídos

Sistemas Distribuídos Sistemas Distribuídos Marcelo Lobosco DCC/UFJF Comunicação em Sistemas Distribuídos Aula 06 Agenda Modelo Cliente-Servidor (cont.) Invocação Remota de Método (Remote Method Invocation RMI) Visão Geral

Leia mais

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP) Hardware (Nível 0) Organização O AS/400 isola os usuários das características do hardware através de uma arquitetura de camadas. Vários modelos da família AS/400 de computadores de médio porte estão disponíveis,

Leia mais

Curso de Java. Acesso a banco de dados através de JDBC. Todos os direitos reservados Klais

Curso de Java. Acesso a banco de dados através de JDBC. Todos os direitos reservados Klais Curso de Java Acesso a banco de dados através de JDBC Todos os direitos reservados Klais Java e SGBD s SQL é a linguagem padrão para acesso a banco de dados e se estabeleceu como tal no mercado. SQL no

Leia mais

Modelos de Arquiteturas. Prof. Andrêza Leite andreza.lba@gmail.com

Modelos de Arquiteturas. Prof. Andrêza Leite andreza.lba@gmail.com Modelos de Arquiteturas Prof. Andrêza Leite andreza.lba@gmail.com Agenda Introdução Arquitetura de Sistemas Distribuídos Clientes e Servidores Peer-to-Peer Variações Vários Servidores Proxy Código Móvel

Leia mais

Roteiro 2 Conceitos Gerais

Roteiro 2 Conceitos Gerais Roteiro 2 Conceitos Gerais Objetivos: UC Projeto de Banco de Dados Explorar conceitos gerais de bancos de dados; o Arquitetura de bancos de dados: esquemas, categorias de modelos de dados, linguagens e

Leia mais

Programação Orientada a Objetos II

Programação Orientada a Objetos II Programação Orientada a Objetos II AULA Banco de Dados (Exemplo) Prof. Rodrigo Rocha Prof.rodrigorocha@yahoo.com (Modo Texto) Conectando ao Banco de Dados Entre no Diretório do Mysql mysql u root p criando

Leia mais

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron alexandre.a.giron@gmail.com

Sistemas Operacionais 2014 Introdução. Alexandre Augusto Giron alexandre.a.giron@gmail.com Sistemas Operacionais 2014 Introdução Alexandre Augusto Giron alexandre.a.giron@gmail.com Roteiro Sistemas Operacionais Histórico Estrutura de SO Principais Funções do SO Interrupções Chamadas de Sistema

Leia mais

QUESTINAMENTOS AO EDITAL DE CONCORRÊNCIA 01/2013

QUESTINAMENTOS AO EDITAL DE CONCORRÊNCIA 01/2013 QUESTINAMENTOS AO EDITAL DE CONCORRÊNCIA 01/2013 Prezados Senhores da comissão de licitação da UENF, seguem alguns questionamentos acerca do edital de concorrência 01/2013 para esclarecimentos: 1. ANEXO

Leia mais

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Curso Adonai QUESTÕES Disciplina Linguagem JAVA 1) Qual será o valor da string c, caso o programa rode com a seguinte linha de comando? > java Teste um dois tres public class Teste { public static void main(string[] args) { String a = args[0]; String

Leia mais

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho. Universidade do Minho Departamento de Informática Camada de Dados - JDBC Aula 1 António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.pt 2 Camada de Dados A camada

Leia mais

SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1

SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1 SUMÁRIO CAPÍTULO 1 INTRODUÇÃO AO JAVA... 1 A Origem... 2 O Caminho Para a Aprendizagem... 4 Java Como Plataforma... 6 Finalidade... 9 Características... 11 Perspectivas... 13 Exercícios... 14 CAPÍTULO

Leia mais

Invocação de Métodos Remotos

Invocação de Métodos Remotos Invocação de Métodos Remotos Java RMI (Remote Method Invocation) Tópicos Tecnologia RMI Introdução Modelo de camadas do RMI Arquitetura Fluxo de operação do RMI Passos para implementação Estudo de caso

Leia mais

Programação de Computadores - I. Profª Beatriz Profº Israel

Programação de Computadores - I. Profª Beatriz Profº Israel Programação de Computadores - I Profª Beatriz Profº Israel As 52 Palavras Reservadas O que são palavras reservadas São palavras que já existem na linguagem Java, e tem sua função já definida. NÃO podem

Leia mais

Estudo de Caso 4.1 Coleta de Estatísticas

Estudo de Caso 4.1 Coleta de Estatísticas 4 Estudo de Caso Com o propósito de melhor apresentar a arquitetura NeMaSA, assim como melhor ilustrar seu funcionamento, dois exemplos práticos de testes desenvolvidos sobre a arquitetura proposta serão

Leia mais

6 - Gerência de Dispositivos

6 - Gerência de Dispositivos 1 6 - Gerência de Dispositivos 6.1 Introdução A gerência de dispositivos de entrada/saída é uma das principais e mais complexas funções do sistema operacional. Sua implementação é estruturada através de

Leia mais

Camadas de Serviço de Hardware e Software em Sistemas Distribuídos. Introdução. Um Serviço Provido por Múltiplos Servidores

Camadas de Serviço de Hardware e Software em Sistemas Distribuídos. Introdução. Um Serviço Provido por Múltiplos Servidores Camadas de Serviço de Hardware e Software em Sistemas Distribuídos Arquiteutra de Sistemas Distribuídos Introdução Applications, services Adaptação do conjunto de slides do livro Distributed Systems, Tanembaum,

Leia mais

Comunicação em Sistemas Distribuídos. Conceitos: Paradigma C/S. Conceitos: Paradigma C/S. Paradigma Cliente/Servidor

Comunicação em Sistemas Distribuídos. Conceitos: Paradigma C/S. Conceitos: Paradigma C/S. Paradigma Cliente/Servidor Comunicação em Sistemas Distribuídos Paradigma / Os processos em um SD estão lógica e fisicamente separados. Precisam se comunicar para que possam interagir O desempenho de um SD depende criticamente do

Leia mais

Curso Tecnológico de Redes de Computadores 5º período Disciplina: Tecnologia WEB Professor: José Maurício S. Pinheiro V. 2009-2

Curso Tecnológico de Redes de Computadores 5º período Disciplina: Tecnologia WEB Professor: José Maurício S. Pinheiro V. 2009-2 Curso Tecnológico de Redes de Computadores 5º período Disciplina: Tecnologia WEB Professor: José Maurício S. Pinheiro V. 2009-2 Aula 3 Virtualização de Sistemas 1. Conceito Virtualização pode ser definida

Leia mais

Tópicos em Sistemas Distribuídos. Modelos de Comunicação

Tópicos em Sistemas Distribuídos. Modelos de Comunicação Tópicos em Sistemas Distribuídos Modelos de Comunicação Comunicação em SD Comunicação entre processos Sockets UDP/TCP Comunicação em grupo Broadcast Multicast Comunicação entre processos Conceitos básicos

Leia mais

Padrões Arquiteturais e de Integração - Parte 1

Padrões Arquiteturais e de Integração - Parte 1 1 / 58 - Parte 1 Erick Nilsen Pereira de Souza T017 - Arquitetura e Design de Aplicações Análise e Desenvolvimento de Sistemas Universidade de Fortaleza - UNIFOR 11 de fevereiro de 2015 2 / 58 Agenda Tópicos

Leia mais

Invocação de Métodos Remotos RMI (Remote Method Invocation)

Invocação de Métodos Remotos RMI (Remote Method Invocation) Invocação de Métodos Remotos RMI (Remote Method Invocation) Programação com Objetos Distribuídos Um sistema de objetos distribuídos permite a operação com objetos remotos A partir de uma aplicação cliente

Leia mais

Introdução Banco de Dados

Introdução Banco de Dados Introdução Banco de Dados Vitor Valerio de Souza Campos Adaptado de Vania Bogorny Por que estudar BD? Os Bancos de Dados fazem parte do nosso dia-a-dia: operação bancária reserva de hotel matrícula em

Leia mais

Sistemas Distribuídos Comunicação entre Processos em Sistemas Distribuídos: Middleware de comunicação Aula II Prof. Rosemary Silveira F. Melo Comunicação em sistemas distribuídos é um ponto fundamental

Leia mais