(QJHQKDULDGH6RIWZDUH MySQL 2001, 2004 (QJHQKDULD GH6RIWZDUH Departamento de Engenharia Informática Instituto Superior Técnico 1 Transacções em MySQL Criar um directório InnoDB, com os subdirectórios data e logs Adicionar ao ficheiro my.cnf, na secção [mysqld] as entradas: innodb_data_file_path = data1:100m;data2:100m innodb_data_home_dir = \data setvariable = innodb_mirrored_log_groups= 1 innodb_log_group_home_dir = \logs setvariable = innodb_log_files_in_group=3 setvariable = innodb_log_file_size=30m setvariable = innodb_log_buffer_size= 8M innodb_flush_log_at_trx_commit=1 innodb_log_arch_dir =! " "$#%% "'&() \logs innodb_log_archive=0 setvariable = innodb_buffer_pool_size=80m setvariable = innodb_additional_mem_pool_size=10m setvariable = innodb_file_io_threads= 4 setvariable = innodb_lock_wait_timeout=50 Relançar o servidor (mysqldmax[nt]) Mais informações no Manual do MySQL 2 1
Importar instruções SQL mysql u< user> p< password> h< host> D< database> f < es2004tables.sql mysql u< user> p< password> h< host> D< database> f < ojbtables.sql 3 (QJHQKDULDGH6RIWZDUH JDBC 2001, 2004 (QJHQKDULD GH6RIWZDUH Departamento de Engenharia Informática Instituto Superior Técnico 4 2
JDBC JDBC in a nutshell Driver Connection Statement ResultSet 5 JDBC DriverManager, carrega os drivers específicos de cada BD, selecciona o driver correcto para o acesso à BD Driver, gere as ligações à BD, uma implementação por cada BD (MySQL, Oracle, etc.) Connection, representa uma ligação à BD, permite criar Statement s Statement, execução de instruções SQL na BD e, obtenção de ResultSet s ResultSet, contém resultado da execução de uma instrução SQL, um cursor permite ler os resultados 6 3
(QJHQKDULDGH6RIWZDUH OJB 2001, 2004 (QJHQKDULD GH6RIWZDUH Departamento de Engenharia Informática Instituto Superior Técnico 7 Arquitectura 8 4
Persistence Broker API Suporta um conjunto mínimo de operações Mapeamento O/ R Leitura de objectos da BD (SELECT) Escrever objectos na BD (INSERT, UPDATE) Apagar objectos da BD (DELETE) Cache de objectos Proxies de objectos proxies dinâmicos proxies de colecções proxies para referências Útil para aplicações simples 9 ODMG API Estende as funcionalidades do PB OQL Object Query Language Transacções (nos objectos!). Mecanismos de sincronização (Locks) Suporte a Collections e Hashtables persistentes 10 5
Exemplo ODMG // obtem interface ODMG / 01234035676 89 5:9 ;0<>=@?ABDC < 36/45E 67 5F3HG I'J // abre a BD K767L7E3>;LM=@9;0<NC 5 3 O K767L7E3HG I'J ;LHC 913 5PG Q4?ABRS319E869S!TPC U02VW K767L7E3NC?XYZ[\Y4]K4[^\'/_4YIJ // inicia uma transação _S7 5E7F689 5`64U:=M9;0<DC 5 3O_ S7 5E7F6 89 5HG I'J 64UDC L3 <8 5HG I'J a'85b7 c2 7E E3d03e? L'f3F69>=gCC C>J // lock para leitura 64UDC 29FhPG 03e?L'f3F69Wi_ S7 5E7F689 5DC \Y4]KI'J // aqui efecutase a leitura do objecto // lock para escrita 64UDC 29FhPG 03e?L'f3F69Wi_ S7 5E7F689 5DC j'xk\4]k YIJ // aqui efectuase a escrita do objecto // commit da transacao para tornar persistentes as alterações 64UDC F940 086NG IJ 11 Configurações OJB OJB.properties repositoryfile= OJB/ repository.xml repository.xml Propriedades JDBC para acesso à BD. driver, username, password, dbalias... repository_user.xml Mapeamento ObjectoRelacional 12 6
(...) Repository.xml (...) < MGEFFRQQHFWLRQGHVFULSWRU platform= "MySQL" jdbclevel="2.0" driver= "com.mysql.jdbc.driver" protocol= "jdbc" subprotocol="mysql" dbalias="// localhost:3306/ esxx" username= esxx" password= :)" /> 13 Repository_user.xml <! Definitions for Dominio.Item > < l'm n o op qsrol'tu vwxdt class= "Dominio.Item table= "ITEM > <! chave primária com geração automática de ids > < yu rsm qnp qsrol'tu vwxnt id= "1 name= "codigointerno column= "CODIGO_INTERNO jdbctype= "INTEGER primarykey= "true autoincrement= "true"/> <! descritor normal > < yu rsm qnp qsrol'tu vwxnt id= "2 name= "nome" column= "NOME jdbctype= "VARCHAR"/> (...) <! conversao entre tipos JAVA vs. JDBC > < yu rsm qnp qsrol'tu vwxnt id= "5" name= "urgente" column= "URGENTE jdbctype= "INTEGER" conversion= "org.apache.ojb.broker.accesslayer.conversions.boolean2intfieldconversion"/> <! chave estrangeira > < yu rsm qnp qsrol'tu vwxnt id= "6 name= "chaveseccao column= "CHAVE_SECCAO jdbctype= "INTEGER"/> <! proxy por referência > < t r'y rt rsz'lr p qsroltu vwxnt name= "seccao classref= "Dominio.Seccao proxy= "true"> < y xnt rsu {Dzs r'}~yu rsm qnp!u qnp!t r'y = "6"/> < /referencedescriptor> < /classdescriptor> 14 7
Repository_user.xml <! Definitions for Dominio.Seccao > < s D ' ƒ4 P D 's ˆN Š class= "Dominio.Seccao" table= "SECCAO"> (...) <! colecção de objectos > < Š D' Š Œ ƒ4 P D 's ˆN Š name= "itens" elementclassref= "Dominio.Item orderby="ordem" sort= "ASC proxy= true > < ŒD N P 4 ' Pƒ!Ž4Š 4 P Œ fieldidref= "6"/> < / collectiondescriptor> (...) < / classdescriptor> 15 Exercício 1/2 Criar suporte persistente para a classe Sitio 1. Adicionar mapeamento O/R ao ficheiro repository_user.xml de acordo com a definição da tabela SITIO (ver ficheiro es2004tables.sql) 2. Criar interface ISitioPersistente com os seguintes métodos ISitio readbynome(string nome) throws ExcepcaoPersistencia; void lockwrite(isitio sitio) throws ExcepcaoPersistencia; void delete(isitio sitio) throws ExcepcaoPersistencia; void deleteall() throws ExcepcaoPersistencia; 16 8
Exercício 2/2 3. Criar SitioOJB que implementa ISitioPersistente e herda de ObjectFenixOJB 4. Publicar a nova interface em ISuportePersistente ISitioPersistente getisitiopersistente(); 5. Actualizar a implementação SuportePersistenteOJB return new SitioOJB(); 17 9