Upload
phamliem
View
247
Download
0
Embed Size (px)
Citation preview
1
CIn.ufpe.br
Fernando Fonseca
Ana CarolinaRobson Fidalgo
Gerenciamento de Dados e Informação
Conectividade
CIn.ufpe.br
Conectividade
O surgimento de ambientes com a arquiteturacliente-servidor compostos por diferentesplataformas vindas de diversos fabricantes requerdas aplicações a necessidade de comunicar-secom outras aplicações para poderem compartilhardados e/ou invocar processos que sejam comuns
2
CIn.ufpe.br
Conectividade
Nos primórdios dos SGBD, toda a conectividade aBD era feita por meio de aplicações escritas paratrabalhar exclusivamente com um SGBDespecífico
Existiam dezenas de produtos para BD e cadaum usava uma linguagem proprietáriaAs aplicações eram dependentes daslinguagens dos sistemas de BDSe uma aplicação existente necessitasse seconectar a um BD em outro SGBD, eranecessário modificá-la para uma novalinguagem
3
CIn.ufpe.br
Conectividade
SGBD
Protocolo comum
Gateway
Interfaces de
comandos padronizados
4
CIn.ufpe.br
Uso de SGBD
Modelo de dados deve abrigar construçõesexistentes nos modelos locaisO SGBD escolhido deve possuir a funcionalidadenecessária para atuar como um SGBD global
Multibanco de dados
5
CIn.ufpe.br
Uso de Protocolo comum de acesso a dados
Baseado na padronização do protocolo utilizado nacomunicação dos diversos componentes doambiente distribuído
RDA (Remote Database Access) - ISO
EDA/SQL (Enterprise Database Access/ SQL) -Information BuildersCORBA (Common Object Request BrokerArchitecture) – OMG...
6
2
CIn.ufpe.br
Uso de Gateway
Tradutores de comandos de acesso a dadosNão possuem funcionalidades de SGBDPodem vir acoplados a SGBD
Normalmente são soluções proprietárias paraconectarem fontes de dados específicas
7
CIn.ufpe.br
Interfaces de ComandosPadronizados
SAG - SQL Access GroupPadrão de interoperabilidade
Qualquer cliente BD pode se comunicardiretamente com qualquer servidor de BDUtilização de formatos de mensagens eprotocolos comunsCria interface SQL com função de chamada(Call Level Interface - CLI)
8
CIn.ufpe.br
Interfaces de ComandosPadronizados
SAG - SQL Access GroupPadrão de interoperabilidade (Cont.)
9
Uma CLI é, simplesmente, uma interface
procedural para SQL
Uma CLI requer o uso de um driver
específico para cada SGBD de modo a
traduzir as chamadas da aplicação para a
linguagem nativa de acesso ao SGBD
IDAPI, ODBC, JDBC, ...
CIn.ufpe.br
Interfaces de Comandos Padronizados
Conjunto comum de API (ApplicationProgramming Interface)
Para SGBD de diversos fabricantesConexão com BD por meio de driver localPreparar solicitações SQLExecutar solicitaçõesRecuperar resultadosEncerrar conexão
10
CIn.ufpe.br
ODBC
Open Database ConectivityMicrosoftImplementações de terceiros - Unix
ComponentesAPIFunções para gerenciar os driversDrivers
11
CIn.ufpe.br
ODBC
Driver
Oracle
Driver
SQL Server
Driver
Xbase ...
Gerenciador de Drivers
Interface ODBC
Aplicação
SGBD
Oracle
Dados
Fonte de
Dados
SGBD
SQL Server
Dados
Fonte de
Dados
Dados
Fonte de
Dados
Outros
SGBD
…
Arquitetura
em Camadas
12
3
CIn.ufpe.br
ODBC - Arquitetura
Aplicação (Camada 1)Um programa que chama funções ODBC parainteragir com fontes de dados
Uma planilha ExcelUma ferramenta de relatórioUm documento WordUma aplicação web...
13
CIn.ufpe.br
ODBC - ArquiteturaGerenciador de Drivers (Camada 2)
Carrega os drivers, direcionando as chamadasde funções ao driver ODBC correto
Provê acesso aos drivers ODBCIntercepta as chamadas da aplicação para obanco de dadosPermite que múltiplos drivers estejam ativossimultaneamente
Carrega e descarrega drivers, verifica status eadministra múltiplas conexões entreaplicações e fontes de dados
14
CIn.ufpe.br
ODBC - Arquitetura
Drivers (Camada 3)É uma biblioteca de funções que processa assolicitações ODBC, enviando instruções SQLespecíficas para cada fonte de dadosTraduz cada requisição para o formatoapropriado do SGBD (Mediador)Conecta uma fonte de dados, traduz comandosSQL e os submete à fonte de dados, recuperainformações da referida fonte e retorna dadospara a aplicaçãoSe a fonte é Xbase (não usa SQL), o drivertambém deve processar os comandos SQL.
15
CIn.ufpe.br
ODBC - Arquitetura
Fontes de Dados (Camada 4)Trata-se dos dados propriamente ditosCada fonte de dados deve possuir um driverapropriado para que a intermediação possa serestabelecida
16
CIn.ufpe.br
ODBCConfiguração
17
CIn.ufpe.br
ODBCConfiguração
18
4
CIn.ufpe.br
Conectividade com Java
ObtençãoDefinição de uma camada de serviço depersistência que utiliza SGBD relacionais
19
CIn.ufpe.br
Conectando Java a um BD Relacional
SGBD
Tabela de Hospitais
CGC Nome leitos
1 Restauracao 1000
2 Portugues 900
. . .
Hospital
int CGC
String nome
int leitos
Métodos
...
Java
20
CIn.ufpe.br
JDBCTM –Java Database Connectivity
API para acesso a SGBD (Sistemas deGerenciamento de Banco de Dados) utilizandoJava
Estabelece uma conexão com o SGBD
Envia comandos SQL para o SGBDProcessa os resultados
Protocolo JDBCDefine regras de comunicação entre umaaplicação Java e um SGBDNecessidade de um driver para efetivar acomunicação (inserido no CLASSPATH)
21
CIn.ufpe.br
Arquitetura de JDBC
JDBC é composto por três componentesprincipais: API, Driver Manager e os DriversJDBC
Oracle 11g
22
CIn.ufpe.br
Tipos de Driver JDBC
Tipo 1 (JDBC-ODBC Bridge)Transforma JDBC em ODBC e se utiliza desseúltimo para comunicação com o SGBD
Tipo 2 (Driver parcial)Mapeia chamadas JDBC para uma API nativa doSGBD. Precisa de código específico de plataformaalém da biblioteca Java
23
CIn.ufpe.br
Tipos de Driver JDBC
Tipo 3 (Drivers Middleware)Driver puro Java para um servidor middleware quedê suporte a clientes JDBC. Utiliza protocoloindependente de SGBD particular
Tipo 4 (Direct-to-database)Driver puro Java que permite a conexão com umservidor de banco de dados. Utiliza protocoloespecífico de um SGBD
24
5
CIn.ufpe.br
Tipo 1: JDBC/ODBC Bridge
Vem com o J2SEFaz acesso JDBC usando drivers ODBCUm driver ODBC deve estar disponível namáquinaUsa código nativoPerde em desempenho porque passa por duascamadas (JDBC e ODBC)Recomendado apenas para testes ou para usoem aplicações não-críticas
25
CIn.ufpe.br
BD
Java
Tipo 1: JDBC-ODBC Bridge
AplicaçãoJava
APIJDBC
JDBC/ODBCBridge
CamadaODBC
APIODBC
Fonte deDados
26
CIn.ufpe.br
Tipo 2: Parte Java, parte Nativo
Um driver Tipo 2 converte chamadas à API JDBCem chamadas à API do SGBDMais rápido que a JDBC/ODBC Bridge porquedispensa uma camada
27
CIn.ufpe.br
BDJava
Tipo 2: Parte Java, parte nativo
AplicaçãoJava
APIJDBC
DriverJDBC
APInativa
Fonte deDados
28
CIn.ufpe.br
Tipo 3: Servidor intermediário
Traduz chamadas à API JDBC para um protocolo derede independente de SGBDAs mensagens independentes de SGBD sãotraduzidas por um servidor intermediário para oprotocolo nativo do SGBDO servidor intermediário é capaz de se conectarcom vários tipos de SGBDArquitetura flexível oferecida por vários fabricantesservidores de aplicações
29
CIn.ufpe.br
BDJava
Tipo 3: Servidor intermediário
AplicaçãoJava
APIJDBC
Fonte deDados
DriverNativo
DriverJDBC
Servidor de driversJDBC
30
6
CIn.ufpe.br
Tipo 4: Puro Java
Converte chamadas à API JDBC diretamente para oprotocolo de rede usado pelo SGBDSão extremamente eficientes
A maioria dos fabricantes fornece drivers tipo 4 juntocom seus SGBD (Oracle, Sybase, IBM, Borland)
31
CIn.ufpe.br
BDJava
Tipo 4: Puro Java
Fonte deDados
AplicaçãoJava
APIJDBC
DriverJDBC
32
CIn.ufpe.br
Tipos de Drivers JDBC: Resumo
Os drivers Tipo 1 e 2 são apenas soluçõestemporárias e rápidas, enquanto soluções puroJava estavam sendo desenvolvidasOs drivers tipo 3 e 4 são os recomendados porserem puro JavaDrivers tipo 3 são mais flexíveis, mas exigem aquebra em camadasDrivers tipo 4 fazem acesso direto a SGBD e sãoos mais simples de usar e instalar
33
CIn.ufpe.br
API de JDBC
Pacote java.sql
InterfacesDriverConnectionStatementResultSetCallableStatementPreparedStatement
DatabaseMetaDataResultSetMetaDataArray
Blob Clob
Ref
34
CIn.ufpe.br
API de JDBC
Pacote java.sql
Interfaces (Cont.)
SQLData
SQLInput
SQLOutput
Struct
...
35
CIn.ufpe.br
API de JDBC
ClassesDriverManagerDateTimestampBatchUpdateException...
36
7
CIn.ufpe.br
API JDBC Standard Extension
Interfaces do pacote javax.sqlConnectionEventConnectionEventListenerConnectionPoolDataSourceCursorMovedEventCursorMovedListenerDataSourcePooledConnectionRowSetRowSetMetaData..
37
CIn.ufpe.br
API de JDBC
ResultSet
Statement
PreparedStatement
CallableStatement
Connection
DriverManager
Tipos de Dados: Date, Time, TimeStamp, Numeric, tipos Java
built-in, etc.
getXXX
executeQuery
execute
executeQuery
getMoreResults
getXXX
setXXX
createStatement
prepareStatement
prepareCall
getConnection
commit, abort
Pacote java.sql
38
CIn.ufpe.br
Conhecendo as Principais Classes
ConnectionSGBD
Statement
ResultSet
39
CIn.ufpe.br
Conhecendo as Principais Classes
Connection(conexão)isClosed( ) – testa se a conexão está fechadaclose( ) – fecha a conexãocreateStatement( ) – cria um comando
Statement(comando)close( ) – fecha o comandoexecuteQuery(String sql) – executa uma consultaem SQLexecuteUpdate(String sql) – faz uma atualizaçãode um registro numa tabela
40
CIn.ufpe.br
Conhecendo as Principais Classes
ResultSet (tabela)Tipos
forward-only
Não possui scroll e é insensitivescroll-insensitive
Não é sensível a mudanças no SGBDscroll-sensitive
É sensível a mudanças no SGBD
41
CIn.ufpe.br
Conhecendo as Principais Classes
ResultSet (tabela) (Cont.)
Habilidades
Scrolling (Rolagem)
Permite ao usuário mover-se para frente e
para trás no conjunto de resultados
Updatability
Permite atualizar automaticamente o Banco
de Dados, caso o usuário altere dados no
conjunto de resultados
42
8
CIn.ufpe.br
Conhecendo as Principais Classes
ScrollingPossibilita que a movimentação do cursor possa serrealizada em ambos os sentidos, por meio dosmétodosboolean previous( )
boolean next( )
boolean absolute(int row) throws SQLException
boolean relative(int rows)
ResultSet (tabela) (Cont.)
43
CIn.ufpe.br
Conhecendo as Principais Classes
Tipos de ConcorrênciaUma aplicação pode escolher entre dois tiposde controle de concorrência para um result set
Somente leituraNão permite atualização do seu conteúdoAtualizávelupdateXXX()
ResultSet (tabela) (Cont.)
44
CIn.ufpe.br
Conhecendo as Principais Classes
getInt(String coluna) – devolve o dado dedeterminada coluna como inteirogetString(String coluna) - devolve o dado dedeterminada coluna como string...
ResultSet (tabela) (Cont.)
45
CIn.ufpe.br
Passos para Acesso ao SGBD
Instalar um driver JDBC para o SGBDconsiderado e configurar o ambiente deexecuçãoCarregar e registrar o driver JDBC
Estabelecer uma conexão com o SGBDSubmeter a execução de comandos SQLLer os resultadosFechar a conexão
46
CIn.ufpe.br
Um BD Exemplo
Um Sistema de Saúde
47
CIn.ufpe.br
Registrando Drivers JDBC
Carregue o(s) driver(s) JDBCClass.forName(nome_do_driver)
O nome do driver é fornecido peloprovedor (Ex.: Oracle)
ExemploClass.forName("oracle.jdbc.driver.OracleDriver ")
11g48
9
CIn.ufpe.br
Estabelecendo uma conexão
Utilize o método getConnection da classejava.sql.DriverManager para abrir uma conexão como SGBDAssinatura de getConnectionstatic Connection getConnection(String url,
String user,String login) throws SQLException
Exemplo de url"jdbc:oracle:thin:@itapissuma.cin.ufpe.br:1521:dbdisc "
49
CIn.ufpe.br
java.sql.Connection
Assinatura dos MétodosStatement createStatement( ) throws SQLException
void setAutoCommit(boolean autocommit) throwsSQLException
void commit( ) throws SQLException
void rollback( ) throws SQLException
void close( ) throws SQLException
50
CIn.ufpe.br
Exemplo: Registrando Drivere Abrindo uma Conexão
//bloco necessario para abrir uma conexao
try{
Class.forName(" oracle.jdbc.driver.OracleDriver ");
Connection con =
DriverManager.getConnection("jdbc:oracle:thin:
@itapissuma.cin.ufpe.br:1521:dbdisc ", " user ", " passwd
");
} catch(ClassNotFoundException ex1){
ex1.printStackTrace();
} catch(SQLException ex2){
ex2.printStackTrace();
}
Login e
Senha no
Banco de
Dados
51
CIn.ufpe.br
Executando Comandos SQL
Utilizar a classe java.sql.Statement para enviarcomandos SQL para o SGBD
Criar um Statement a partir da conexão
Exemplo
Statement stmt = con.createStatement();
52
CIn.ufpe.br
java.sql.Statement
Assinatura dos Métodosint executeUpdate(String sql) throws SQLException
Para executar comandos DML - INSERT,UPDATE e DELETE - ou DDL - CREATE, DROP,etc.
ResultSet executeQuery(String sql) throwsSQLException
Para executar comandos SELECT
53
CIn.ufpe.br
java.sql.ResultSet
Assinatura dos Métodosboolean next( ) throws SQLException
Posiciona o cursor na próxima linha
Inicialmente o cursor está antes da primeira linhaString getString(int col) throws SQLExceptionString getString(String nomeColuna) throwsSQLException
54
10
CIn.ufpe.br
ResultSet:getXXX métodos
55
CIn.ufpe.br
Aperfeiçoando ResultSet
...
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
stmt.setFetchSize(25);
rset = stmt.executeQuery( "SELECT * FROMHOSPITAL ");
56
CIn.ufpe.br
Exemplo: Criando uma tabela
try { stmt = con.createStatement();
String sql = " CREATE TABLE HOSPITAL ( CGC NUMBER, NOME VARCHAR2(40),
NUMERO_LEITOS NUMBER) ";stmt.executeUpdate(sql);
} catch(SQLException se) { se.printStackTrace(); }catch(ClassNotFoundException ce) {
ce.printStackTrace(); }
57
CIn.ufpe.br
Exemplo: Inserindo Dados em uma Tabela
Statement stmt; //Exemplo de INSERT
try{
stmt = con.createStatement();
stmt.executeUpdate(" INSERT INTO Hospital (CGC,
nome,leitos) VALUES (1,'Restauração',1000) ");
System.out.println(" Insercao realizada ");
stmt.close();
} catch(SQLException ex2){
ex2.printStackTrace(); }
58
CIn.ufpe.br
Exemplo: Removendo Dados de uma Tabela
Statement stmt; //Exemplo de DELETE
try{
stmt = con.createStatement();
stmt.executeUpdate(" DELETE FROM Hospital WHERE
CGC=1 ");
System.out.println(" Delecao realizada ");
stmt.close();
} catch(SQLException ex2){
ex2.printStackTrace(); }
59
CIn.ufpe.br
Exemplo: Atualizando Dados em uma Tabela
Statement stmt; //Exemplo de UPDATE
try{
stmt = con.createStatement();
stmt.executeUpdate(" UPDATE Hospital SET leitos=500
WHERE CGC=1 ");
System.out.println(" Atualizacao realizada");
stmt.close();
} catch(SQLException ex2){
ex2.printStackTrace(); }
60
11
CIn.ufpe.br
Exemplo: Consultando Dados em uma Tabela
Statement stmt; //Exemplo de SELECT
try{
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM
HOSPITAL ");
while(rs.next()){
int cgc = rs.getInt(" CGC ");
String nome = rs.getString(" Nome ");
int leitos = rs.getInt(" leitos ");
61
CIn.ufpe.br
Exemplo: Consultando Dados em uma Tabela
rs.close();
stmt.close();
} catch(SQLException ex2){
ex2.printStackTrace();
}
Hospital novo = new Hospital(cgc,nome,leitos);
System.out.println(novo);
}
62
CIn.ufpe.br
java.sql.CallableStatement
Executa chamadas a stored procedures no SGBD
Reduz o tempo de execução para comandos SQL
que são executados várias vezes seguidas
Os comandos são pré-compilados pelo SGBD
java.sql.PreparedStatement
63
CIn.ufpe.br
Exemplo: PreparedStatement
Try { ....
s = “SELECT * FROM USUARIO WHERE CODIGO= ?”;
pstmt = con.prepareStatement(s);
pstmt.setInt(1,1);
pstmt.executeQuery();
....
} catch(SQLException e) { }
64
CIn.ufpe.br
Metadados
Informação a respeito de dadosDatabaseMetadataDados a respeito da base de dados como umtodo - estrutura do Banco de Dados
Fabricante e versão do SGBDDescrição de tabelas (nomes das colunas,chaves,...)
Informações a respeito de características comsuporte (ou não) pelo sistema
65
CIn.ufpe.br
DatabaseMetaData
Informações a respeito de características(Cont.)
Aproximadamente 150 métodos
Muitos deles retornam ResultSets
Não há padronização nas respostas dadaspor cada implementação
Alguns drivers não dão suporte a todos osmétodos
DatabaseMetaData dbmd = con.getMetaData();
66
12
CIn.ufpe.br
ResultSetMetaData
Informação a respeito de dados (Cont.)
ResultSetMetadata
Informações a respeito de tipos e propriedades
das colunas de um ResultSet
Número de colunas retornadas
Nomes e tipos de cada coluna
Gerado a partir de um ResultSet, resultado de
uma consulta
ResultSetMetaData rsmd = rs.getMetaData();
67
CIn.ufpe.br
ResultSetMetaData
Exemplo: Listar o nome de todas as colunas
…
for (int i=0;i<rsmd.getColumnCount();i++){
nome=rsmd.getColumnName(i);
System.out.println(nome);
}
68
CIn.ufpe.br
Atualizações em LotePermite que várias operações de update possamser submetidas juntas para processamento doSGBD, ao invés de sozinhas
Exemplo
try { con.setAutoCommit( false );
stmt.clearBatch();
stmt.addBatch( sUpdate1 );
stmt.addBatch( sUpdate2 );
stmt.addBatch( sUpdate3 );
int[ ] conta = stmt.executeBatch();
} catch(SQLException e) {}
69
CIn.ufpe.br
Tipos de Dados Avançados(SQL3)
Large Objects (LOB)
Binary Large Objects (BLOB)
Character Large Objects (CLOB)
Locator
Interface para associar um evento SAX com alocalização de um documento (Processamento deXML)
70
CIn.ufpe.br
java.sql.Blob
Assinatura dos MétodosInputStream getBinaryStream( ) throwsSQLException
byte[ ] getBytes(long pos, int length) throwsSQLExceptionlong length( ) throws SQLException....
71
CIn.ufpe.br
Exemplo: Blob
try {PreparedStatement getFotoStmt = con.prepareStatement("SELECT IMAGEM FROM IMAGENS WHERE CODIGO = ?");getFotoStmt.setInt(1, 1);rs = getFotoStmt.executeQuery();if (rs.next()) {
fotoBlob = rs.getBlob(“IMAGEM");byte teste[ ] = fotoBlob.getBytes(1,
(int)fotoBlob.length());if (teste != null) {result =
(Image)Toolkit.getDefaultToolkit().createImage(teste); }} else System.out.println(“erro”);} catch (SQLException ex) { ex.printStackTrace();}
72
13
CIn.ufpe.br
java.sql.Clob
Assinatura dos MétodosInputStream getAsciiStream( ) throwsSQLException
Reader getCharacterStream( ) throwsSQLExceptionString getSubString(long pos, int length) throwsSQLException...
73
CIn.ufpe.br
Transações
Preservam a consistência dos dados do SGBDPropriedades das transações (ACID):
Atomicidade
ConsistênciaIsolamentoDurabilidade
74
CIn.ufpe.br
Implementando Transações
Propriedades auto-commit de Connectiontrue - realiza commit após cada operaçãoexecutada pelo Statement sercompletada(default)
false - não realiza commit automaticamente
75
CIn.ufpe.br
Implementando Transações
MétodossetAutoCommit(boolean autoCommit)
Define o modo de commit
commit( )Confirma a transação
rollback( )Cancela a transação
76
CIn.ufpe.br
Exemplo de Transaçãocom JDBC
Try { ...con.setAutoCommit(false);stmt = con.createStatement();String sql1 = “INSERT INTO HOSPITAL (5,’Neuro’,800)”;String sql2 = “INSERT INTO USUARIO (6,’Hope’,750)”;stmt.executeUpdate(sql1);stmt.executeUpdate(sql2);con.commit();
} catch(SQLException se) {try { con.rollBack(); }catch(SQLException e){e.printStackTrace(); }e.printStackTrace();
}
77
CIn.ufpe.br
Transações - Isolamento
Níveis de isolamentoREAD COMMITTED
Nível default de alguns SGBD
Modificações realizadas por outras transaçõessó se tornam visíveis depois do commitDuas transações concorrentes podemmodificar o mesmo registro
78
14
CIn.ufpe.br
READ COMMITTED
Exemploa=0;
Update t set a=1;
commit
select a from t1; Retorna 0
T1 T2 comentário
select a from t1; Retorna 1
update t set a=2;
Select a from t1; Retorna 1
Commit
Select a from t1; Retorna 2
79
CIn.ufpe.br
Transações - Isolamento
Níveis de isolamento (Cont.)SERIALIZABLE
Nível mais estrito de isolamento
Menor nível de concorrênciaModificações realizadas por outrastransações não são visíveis para atransação correnteA transação corrente sempre se tem avisão do banco do início da transação
Duas transações concorrentes não podemmodificar o mesmo registro
80
CIn.ufpe.br
SERIALIZABLE
Exemploa=0;
Update t set a=1;
select a from t1; Retorna 0
commit
select a from t1; Retorna 0
Begin work Inicia nova transação
Update t set a=3 Lock exclusivo em a
update t set a=2; T2 trava esperando o lock
commit Rollback automático em T2
T1 T2 Comentário
81
CIn.ufpe.br
Transações e JDBC
con.setAutoCommit(false); // Inicia a transação
con.setTransactionIsolation(con.TRANSACTION_READ_COMMITTED);
(…)
con.commit();
(…)
}catch(SQLException e){
con.rollback(); // SEMPRE termine a transação!
}
82