Professional Documents
Culture Documents
Belém - PA
2006
UNIVERSIDADE FEDERAL DO PARÁ
CENTRO DE CIÊNCIAS EXATAS E NATURAIS
CURSO BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO
Belém - PA
2006
UNIVERSIDADE FEDERAL DO PARÁ
CENTRO DE CIÊNCIAS EXATAS E NATURAIS
CURSO BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO
Banca Examinadora:
[Viviane]: Agradeço a Deus, que sempre esteve e estará ao meu lado, me dando
forças e saúde para seguir em frente. À minha mãe, pelo amor, carinho e
paciência sempre presente. Aos meus irmãos pelo exemplo a ser seguido e
pela força. Ao meu noivo pela ajuda, amor, carinho e companheirismo. Ao
meu orientador, pela ajuda e paciência no desenvolvimento deste trabalho.
Aos professores, pelos ensinamentos ao longo dos cinco anos de curso,
auxiliando no meu crescimento profissional. Aos meus amigos, pelo
companheirismo e incentivo.
"Cada momento da nossa vida é um
ensaio para o que vem a seguir".
Marcio Giulierme
6
SUMÁRIO
Introdução................................................................................................................15
Capítulo 1. Princípios Arquiteturais ................................................................................ 17
1.1. Arquitetura X Designer ................................................................................18
1.2. Arquitetura no Processo de Desenvolvimento de Sistemas........................20
1.3. Princípios de arquiteturas............................................................................21
1.3.1. Capacidades de uma arquitetura..........................................................24
Capítulo 2. Padrões de Projetos e melhores práticas para projetos J2EE ................ 26
2.1. Padrões GoF...............................................................................................27
2.2. Padrões J2EE .............................................................................................28
2.2.1. Patterns da camada de apresentação ..................................................28
2.2.2. Patterns de camada de negócios .........................................................30
2.2.3. Patterns de camada de Integração.......................................................31
2.3. Benefícios e Problemas do uso de Padrões de Projeto ..............................32
Capítulo 3. Arquiteturas J2EE......................................................................................... 34
3.1. Container WEB em J2EE ............................................................................34
3.2. EJB e o modelo de container ......................................................................35
3.3. Performance com EJB ................................................................................37
3.4. Tipos de EJB...............................................................................................39
3.4.1. Session Beans......................................................................................39
3.4.2. Entity Bean ...........................................................................................41
3.4.3. Message Driven Bean ..........................................................................42
Capítulo 4. Aplicando a tecnologia J2EE e seus problemas ....................................... 45
4.1. Quando aplicações distribuídas são apropriadas?......................................45
4.1.1. Aplicações Distribuídas e Escalabilidade .............................................45
4.1.2. Aplicações Distribuídas e Confiabilidade ..............................................47
4.1.3. Quando se deve usar EJB? ..................................................................48
4.1.3.1. Gerenciamento de transações .......................................................48
4.1.3.2. Aspectos negativos de EJB............................................................49
4.2. Acesso a dados em aplicações J2EE .........................................................50
Capítulo 5. Uso de arquiteturas leves com a adoção de novos conceitos................. 52
5.1. Diminuição de Acoplamento ........................................................................52
5.2. Inversão de Controle ...................................................................................54
5.2.1. Formas de implementação de Inversão de Controle ............................54
5.2.1.1. Setter Injection ...............................................................................54
5.2.1.2. Constructor Injection ......................................................................56
5.2.1.3. Interface Injection...........................................................................57
5.2.2. Constructor Injection x Setter Injection .................................................60
5.3. Testabilidade em Aplicações J2EE..............................................................61
5.3.1. Técnica Funcional.................................................................................62
5.3.2. Técnica Estrutural.................................................................................64
5.3.3. Testes na metodologia Extreme Programing (XP)................................64
5.3.3.1. Testes Unitários no XP...................................................................65
5.3.3.2 Testes de Aceitação........................................................................66
5.3.4. Testes com EJB....................................................................................66
5.4. Camada de acesso a dados simplificada ....................................................68
5.4.1. Utilizando Hibernate com Spring ..........................................................69
5.4.2. Utilizando IBatis com Spring .................................................................71
5.5. Programação Orientada a Aspectos............................................................72
6
7
7
8
LISTA DE FIGURAS
8
9
LISTA DE TABELAS
9
10
LISTAGENS
10
11
LISTA DE SIGLAS
AOP Programação Orientada a Aspectos
API Application Programming Interface
ASP Active Server Pages
BMP Bean Manager Persistence
CMP Container Manager Persistence
DAO Data Acess Object
DBMS Database Manager System
EIS Enterprise Information System
EJB Enterprise Java Beans
GOF Gang Of Four
HQL Hibernate Query Language
HTML Hyper Text Markup Language
http HyperText Transfer Protocol
IDE Integrated Development Environments
IIOP Internet Inter-Orb Protocol
IOC Inversion of Control
J2EE Java2 Platform Enterprise Edition
JDBC Java Database Connectivity
JMS Java Message Service
JNDI Java Naming and Directory Interface
JSP Java Server Pages
JTA Java Transaction API
LDAP Lightweight Directory Acess Protocol
LRU Last Recent Used
MDB Message Driven Bean
MDP Message Driven Pojo
MVC Model-View-Controller
POJO Plain Old Java Objects
RMI Remote Method Invocation
RPC Remote Procedure Call
SQL Structured Query Language
XML Extensible Markup Language
XP Extreme Programing
11
12
RESUMO
12
13
ABSTRACT
13
14
Introdução
1
Computador de grande porte, dedicado normalmente ao processamento de um volume grande de informações.
2
Termo utilizado para evidenciar arquiteturas que não possuem grande processamento em seus clientes.
3
Termo com significado de herança, normalmente sistemas e hardware antigos de empresas que guardam uma
grande quantidade de informação.
14
15
15
16
Capítulo 1
Princípios Arquiteturais
Muito se fala de arquiteturas de software, porém, para que não haja dúvidas
seguintes no trabalho, faz-se necessária uma explanação sobre sua origem e seu
significado tanto na área tecnológica como em outras áreas originais.
A palavra “Arquiteto” tem origem grega, vem de Architekton, que significa
“construtor chefe”. O termo era usado na Grécia antiga para designar o mestre de
obras dos antigos templos gregos. Pode-se dizer que o objetivo do arquiteto é
sempre reorganizar o ambiente, construir, arquitetar e modelar, sejam edifícios,
instituições ou teorias. Mas qual seria o propósito do arquiteto nos dias de hoje?
Segundo [ALL2003], os arquitetos visualizam o comportamento de um sistema. Eles
criam a planta para os requisitos de sistema funcionais e não-funcionais.
Nesse contexto, a formalização da arquitetura como uma disciplina de
engenharia para o desenvolvimento de software começou com Mary Shaw e David
Garlan, com a publicação do livro “Software Architecture. Perspectives on an
Emerging Discipline”, em 1996 [SHA1996]. A necessidade de várias visões e vários
níveis de abstração na modelagem dos requisitos que serão implementados era
percebida pelos projetistas, mas não registradas até então. Com esta formalização,
surge também o papel do arquiteto de software.
A definição clássica de arquitetura apresentada por [SHA1996] diz que
arquitetura de software define o que é o sistema em termos de componentes
computacionais e os relacionamentos entre estes componentes.
Semelhante a esta definição, [BAS1998] diz que arquitetura de software são as
estruturas que incluem componentes, suas propriedades externas e os
relacionamentos entre eles, constituindo uma abstração do sistema. Esta abstração
suprime detalhes de componentes que não afetam a forma como eles são usados
ou como eles usam outros componentes, auxiliando o gerenciamento da
complexidade.
Para [JAZ2000], a arquitetura de software é colocada como uma ferramenta
para lidar com a complexidade do software e enfatizam que arquitetura deve
satisfazer os requisitos funcionais e não-funcionais do sistema, incrementando a
definição de que arquitetura de software é o conjunto de componentes e seus
16
17
4
Conceito visto no capítulo 2.
5
Estrutura de suporte definida em que um outro projeto de software pode ser organizado e desenvolvido.
17
18
18
19
A figura 1.2 mostra o ponto onde as atividades da arquitetura são mais visíveis
dentro do processo de desenvolvimento de sistemas. A diferença entre as fases de
análise e de projeto e as atividades de arquitetura só são evidentes quando se trata
de sistemas grandes e complexos.
Para sistemas pequenos, a transição entre as fases de engenharia de
requisitos, análise e projeto é tranqüila, pois os modelos gerados nestas fases são
suficientes para representar os requisitos necessários, satisfazendo a construção do
19
20
sistema.
20
21
21
22
6
Camada de uma aplicação que interage com o usuário.
7
Camada de armazenamento de dados em uma arquitetura de N camadas.
22
23
Disponibilidade
Essa característica está sempre relacionada ao desempenho. A disponibilidade
é o grau em que um sistema é operável em um estado saudável. Matematicamente
a disponibilidade é um (1) menos a indisponibilidade. A disponibilidade é a relação
entre o tempo total em que uma unidade funcional é capaz de utilizar durante um
determinado intervalo e a extensão do intervalo. Um exemplo de disponibilidade é
100/168, se a unidade for capaz de ser utilizada por 100 horas em uma semana
[ALL2003].
Gerenciabilidade e Flexibilidade
Gerenciabilidade se refere ao conjunto de serviços que assegura a integridade
continuada, ou correção, da aplicação. Ela inclui segurança, controle de
concorrência e gerenciamento do servidor. Um exemplo métrico de gerenciabilidade
seria a quantidade de horas de pessoal no mês gastas para atualizações no
servidor.
Flexibilidade é a chave para uma aplicação disponível, confiável e escalonável.
É a capacidade de realizar mudanças arquiteturais para conceber novos requisitos
em uma maneira eficiente e não custosa. Tipicamente, uma aplicação flexível é uma
aplicação de fácil manutenibilidade. A separação do sistema em camadas aumenta
muito a flexibilidade de um sistema.
Desempenho
Atualmente, o desempenho é a capacidade de executar funções
suficientemente rápidas para atenderem aos objetivos. O tempo de resposta e a taxa
de resposta são importantes para uma aplicação.
Escalabilidade
Escalabilidade é a capacidade de suportar de uma maneira eficiente o aumento
da demanda de requisições sem afetar drasticamente a performance e com isso o
23
24
24
25
Capítulo 2
25
26
26
27
Assim como para os padrões GoF, o J2EE apresenta uma divisão em seus
padrões. Eles são divididos em três categorias, de acordo com camada [ALL2003]:
Patterns da Camada de Apresentação, Patterns da Camada de Negócios e Patterns
da Camada de Integração.
27
28
duplicação de código.
• Transfer Object Assembler: O objetivo deste padrão é construir um modelo
de dados requerido pelo cliente, utilizando vários Transfer Objects para
recuperar os dados dos objetos necessários ao modelo que o cliente deseja.
Ele acaba por reduzir o acoplamento existente entre os clientes e o modelo da
aplicação, além de melhorar a performance da rede.
• Value List Handler: Deve-se utilizar este padrão quando se quer ter controle
sobre a busca, e precisa fornecer recursos de processamento de listas, e
também se deseja fazer cache dos resultados do lado do servidor. Com isso,
ela melhora a performance da rede, assim como em outros padrões.
• Value Object: Este padrão surgiu com o intuito de minimizar o número de
chamadas remotas que são necessárias quando está usando EJB, ou seja,
serve para encapsular os dados de negócios.
modificada, este padrão permite alterar a fonte de dados sendo utilizada numa
aplicação sem afetar os componentes de negócios que fazem uso deste.
O uso deste padrão resulta na transparência da aplicação quanto a fonte de
dados, facilita a migração de uma fonte de dados a outra, além de criar uma
nova camada, onde ficará centralizado o acesso a dados.
31
32
32
33
Capítulo 3
Arquiteturas J2EE
33
34
34
35
35
36
36
37
estado conversacional.
Um session bean representa o trabalho realizado por um único cliente. Esse
trabalho pode ser realizado dentro de uma única invocação de método ou pode
englobar diversas invocações de métodos. Se o trabalho abranger mais de um
método, deve-se reter o estado do objeto do usuário por todas as chamadas
subseqüentes. Portanto um bean de sessão com estado é requerido [ALL2003].
Um típico exemplo de bean com estado conversacional é uma aplicação de e-
commerce que possui um carrinho de compras. Ao longo da navegação, o cliente
pode adicionar ou remover itens no carrinho. Tal lógica poderia ser implementada
usando statefull session beans.
Naturalmente os processos de negócios são realizados usando apenas uma
simples e única requisição de conversação com o cliente. Como visto anteriormente,
uma simples chamada ao método de negócio pelo cliente não requer estado
conversacional. Como o processo é concebido através de apenas um método, o
container que o gerencia normalmente após a chamada do método o bean pode ser
destruído, pode ser recriado ou pode, na maioria das vezes, voltar para o pool de
beans. Um exemplo de uso de beans sem estado é um componente que realiza uma
consulta em algum ambiente de armazenamento de dados e o retorna para o cliente,
o cliente somente faz uma chamada e o componente o devolve a resposta ao
cliente.
Na figura 3.2 pode-se ter uma idéia do modelo de pool de EJBs de sessão.
39
40
40
41
Foi mostrado na seção anterior que os EJBs de sessão são modelados para
realizar regras de negócio, algoritmos, serviços para o cliente. Do outro lado, cada
aplicação necessita ter seus objetos de modelo persistidos. É nesse contexto que
entra a tecnologia dos entities beans.
Beans de Entidade modelam conceitos de negócios que podem ser expressos
por nomes e esta é uma regra importante quando na sua modelagem de sistema o
desenvolvedor precisa eleger um candidato a ser um Bean de Entidade. Estes tipos
de beans modelam realmente um dado no banco de dados onde uma instância
representa uma linha na tabela de um banco de dados. A partir disto pode-se ter o
questionamento: Porque não acessar o banco de dados diretamente? Existem
muitas vantagens em se usar Beans de Entidade ao invés de acessar a base de
dados diretamente. Estes beans promovem um simples mecanismo de acesso e
alteração de dados. É muito mais fácil, por exemplo, executar um método para
atualizar um campo de um entity do que fazer um comando SQL11 para isto. Quando
um novo bean é criado, um novo registro deve ser inserido na base de dados e uma
instância do bean associada a este dado. Conforme o bean é usado e seu estado é
alterado, estas mudanças devem estar sincronizadas com a base de dados. Este
processo de coordenação dos dados do banco de dados com a instância do bean é
chamado de persistência.
Um bean de entidade pode ser considerado como de vida longa (long-lived)
porque sobrevive a um crash no servidor de aplicativos e por sua característica em
um modelo N-tier ficaria mais próximo do DBMS (Database Manager System).
Com relação aos beans de sessão, os beans de entidade são muito diferentes,
pois ao invés de se modelar um fluxo de controle (workflow), que é papel do session
bean, eles são responsáveis pelos dados de negócios (Core Business Data). Já com
relação ao mapeamento com as tabelas, um bean de entidade não necessita estar
mapeado para uma única tabela, ele pode ser representado por várias, devido na
fase de design nem toda tabela de seu esquema de persistência necessita estar
mapeada para um bean de entidade.
11
sintaxe usada para a definição e manipulação de dados em um banco de dados relacional.
41
42
Java fora do container J2EE. Existia um programa Java que era ativado e conectado
a um destino JMS que ficava esperando as mensagens.
Embora a construção de consumidores de mensagens por meio de aplicações
Java fosse uma das melhores soluções para o problema, esta solução gerava vários
outros problemas e o maior seria a escalabilidade. Quando o número de mensagens
na fila aumentava, haveria a necessidade de se executar um programa Java multi-
threads para promover a escalabilidade da leitura destas mensagens, e se este
volume variasse muito, ficaria difícil fazer um algoritmo que, na medida exata,
consumiria as mensagens sem perda de performance com muitas threads e sem
perda destas mensagens no caso de poucas threads.
Baseados nisto, alguns vendedores de EJB pensaram nesta funcionalidade na
versão 1.1. Porém, a especificação não definia este tipo de bean, o que fazia com
que cada vendedor tivesse um padrão.
Basicamente, beans orientados a mensagens processam alguma lógica de
negócios usando mensagens JMS enviadas para uma destinação particular, ou seja,
consomem mensagens JMS através da tecnologia EJB.
A grande diferença entre beans orientados a mensagens e os beans de sessão
ou de entidade é que os beans orientados a mensagens não possuem interfaces
home nem interface remote. Então, podemos deduzir que estes beans são
completamente escondidos do cliente. O único meio dos clientes comunicarem com
os beans orientados a mensagens seria enviando uma mensagem para um
destinatário JMS. A figura 3.3. demonstra o funcionamento dos beans orientados a
mensagens.
42
43
Como se pôde verificar, um cliente envia uma mensagem JMS para um destino
e o container passa esta mensagem JMS para uma instância do bean orientado a
mensagens que tem se registrado como um receptor de mensagens para uma
destinação particular. Por usar um pool de instância de beans, o container é capaz
de manipular as mensagens que chegam de uma forma muito mais eficiente e
aumenta a escalabilidade das operações JMS. As instâncias dos beans podem ser
colocadas ou retiradas do pool dependendo das necessidades do container de
atender as requisições.
43
44
Capítulo 4
44
45
Soluções com apenas uma máquina virtual Java (JVM) tem uma performance
mais alta que aplicações distribuídas, devido ao fato da latência de invocações
remotas. Além disso, aplicações com JVM únicas podem ser clusterizadas
facilmente. Containeres web de alta qualidade oferecem funcionalidades de cluster,
esse não é um requisito apenas de containeres EJB.
Vantagens como balanceamento de carga de requisições HTTP pode ser
realizada por elementos do cluster oferecidos pelo servidor J2EE ou por
componentes como o Cisco Loader Balance. Usando o balanceamento de carga
através de hardware tem-se a vantagem de igual funcionamento em qualquer
servidor J2EE.
Apenas adicionando uma camada remota (como uma camada EJB) em uma
aplicação Web não necessariamente torna o sistema mais escalável. Uma aplicação
que não requer armazenamento de estado no servidor pode crescer linearmente e
indefinidamente sem o uso de chamadas remotas. Quando o armazenamento de
estado é requerido, a escalabilidade torna-se limitada, mesmo adotando uma
solução distribuída [JOH2004].
Se nós carregarmos o estado da aplicação no servidor web (através do objeto
HttpSession), a qualidade do suporte a cluster (roteamento e gerenciamento de
estado) do servidor web irá ditar a escalabilidade do sistema. Se carregarmos o
estado no container EJB, em statefull session beans, o container EJB terá uma
dificuldade semelhante. O EJB não pode ser considerado uma “bala da prata” que
faz com que o problema da replicação de estado se resolva tão facilmente.
Uma aplicação distribuída com interfaces remotas somente será mais escalável
que aplicações com máquina virtual única somente nesses casos:
• Os objetos acessados remotamente não possuem estado (stateless),
mesmo que o estado seja mantido na camada web.
No contexto de J2EE isso significa que as regras de negócios serão
implementadas usando stateless session beans.
• Muitos dos objetos de negócio consumem recursos que não podem ser
alocados em qualquer servidor ou em qualquer camada.
Nesses raros cenários, acoplando a camada web com a camada de
negócios tem-se uma limitação de escalabilidade comparada a
arquiteturas cliente-servidor.
• Os objetos de negócio realizam um trabalho bem superior que a camada
45
46
web
Nesse cenário será necessário rodar as regras de negócios em mais
containeres EJB.
Um modelo de objetos de negócio sem estado é considerado altamente
escalável, pois se pode adicionar quantos containeres EJBs quanto desejado, sem
aumentar com isso o número de containeres web ou o overhead de algum tipo de
replicação de estado que possa ser requerida na camada web. Entretanto, essa
arquitetura somente será mais escalável que uma arquitetura simples se a carga
entre a camada de negócio e a camada web for pequena [JOH2004].
46
47
48
49
Java Objects). Os clientes, para acessarem EJBs precisam fazer consultas através
de JNDI, além de tratar uma série de exceções da plataforma. Mas por que tudo
isso é necessário?
Para se entregar serviços com um gerenciamento transparente de transações,
o container precisa ter total controle das instâncias em tempo de execução. O uso
de classes geradas pelo container permite que as chamadas a métodos EJBs sejam
interceptadas pelo servidor, gerenciando com isso seus acessos, assegurando que a
escolha correta de contexto transacional seja fornecida [JOH2004].
Entretanto, os autores afirmam que o custo de se desenvolver e manter uma
aplicação EJB não é vantajoso o suficiente para muitas aplicações. Muitas vezes é
dada uma infra-estrutura enorme que não necessariamente será usada por
completo.
49
50
50
51
Capítulo 5
A demanda por projetos com um prazo cada vez menor e com poucos
recursos, a fim de alocarem profissionais ou comprar ferramentas, vem se tornando
uma constante no campo de desenvolvimento de software no cenário brasileiro e
mundial. Fica praticamente inviável a elaboração de arquiteturas com grau de
complexidade elevado. Tendo isto em mente, os autores pretendem mostrar
detalhes da elaboração de uma arquitetura bem mais viável para o desenvolvimento
de software.
Tal arquitetura não adotará o modelo de componentes padrão do J2EE (EJBs),
com isso, a arquitetura se baseia em alguns projetos de código aberto desenvolvidos
pela própria comunidade Java. Além do uso de frameworks para a diminuição do
trabalho, a utilização de novos conceitos será fundamental para a disponibilização
de recursos que antes eram apenas possíveis dentro de um servidor de aplicação
através de EJBs. Dentre os conceitos, pode-se citar: gerenciamento declarativo de
transações; Inversão de controle; orientação a Aspectos, Mensagens orientadas a
objetos Java normais, fácil testabilidade, entre outros.
51
52
52
53
53
54
Por fim, há um arquivo XML que possui toda a configuração, onde será ditada a
injeção. A configuração também poderia ser feita através de código.
<beans>
<bean id="MovieLister" class="MovieLister">
<property name="finder">
<ref local="MovieFinder"/>
</property>
</bean>
<bean id="MovieFinder" class="ColonMovieFinder">
54
55
<property name="filename">
<value>movies1.txt</value>
</property>
</bean>
</beans>
55
56
Listagem 5.9: Interface que irá injetar objetos através do Interface Injection
56
57
Por fim, é criada uma classe de configuração. Esta classe irá registrar as
classes que possuem os objetos a serem injetados, igualmente como ocorre com o
Constructor Injection. Além disso, também há um método que registra as interfaces
definidas:
57
58
58
59
60
61
61
62
A maioria das ferramentas que auxiliam os testes oferece apoio apenas para o
teste estrutural (mostrado em 5.3.2), porém algumas ferramentas específicas para
testes funcionais encontram-se disponíveis, como TestComplete [TES2006],
SPACES [DAN2006], Jtest [JTE2006], XDE tester [XDE2006] e o framework JUnit
[JUN2006], este, apesar de não apoiar nenhuma técnica de teste específica, pode
ser utilizado para especificação e execução dos casos de teste [DAN2006].
A tabela 5.1, mostra um comparativo entre as ferramentas acima citadas,
enfatizando suas características principais com relação aos testes funcionais.
62
63
63
64
64
65
“Primeiramente, escreve-se os casos de teste, os quais conectam com o servidor EJB e são
executados em uma JVM (Java Virtual Machine) diferente da JVM utilizada pelo container EJB. Pode-
se invocar os casos de teste normalmente, como qualquer outro teste, com a diferença de tomar
cuidado em prover as propriedades JNDI apropriadas que permitem a conexão do container EJB”.
66
67
Tabela 5.2.: Tabela comparativa das três alternativas de testes com EJB
67
68
68
69
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.
DriverManagerDataSource">
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="url">
<value>jdbc:hsqldb:db/app</value>
</property>
<property name="username"><value>sa</value></property>
<property name="password"><value></value></property>
</bean>
</beans>
69
70
<sqlMapConfig>
<sqlMap resource=”Client.xml”/>
<sqlMap resource=”Boss.xml”/>
<sqlMapConfig>
70
71
<sqlMap>
<typeAlias alias="client" type="br.com.sistema.Client"/>
<insert id=" gravar" parameterClass="client">
INSERT INTO CLIENT (ID, NOME)
VALUES
(#id#, #nome”)
</insert>
<select id="listarPorPK" resultClass="client"
parameterClass="int">
SELECT ID as id
,NOME as nome
FROM CLIENT
WHERE ID = #id#
</select>
A principal vantagem do IBatis é que ele não gera nenhum código, além, de
não ser necessário o desenvolvedor aprender nenhuma linguagem (como o HQL, no
Hibernate), já que o IBatis utiliza o próprio SQL.
Na aplicação desenvolvida neste trabalho, foi utilizado o IBatis em conjunto
com o Spring.
71
72
72
73
12
API para tratamento de transações na plataforma Java.
73
74
class="org.springframework.transaction.jta.JtaTransactionManager" />
class="org.springframework.transaction.interceptor.TransactionProxyFactoryB
ean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-
BMSBusinessException</prop>
</props>
</property>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation">
<value>classpath:br/com/bms/mes/aci/eis/data/daoimpl/ibatis/sql-map-
config.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
74
75
</beans>
75
76
13
Conjunto de rotinas e padrões estabelecidos por um software para utilização de suas funcionalidades. Ela é
composta por uma série de funções acessíveis somente por desenvolvedores, e que permitem utilizar
características do software menos evidentes ao usuário tradicional.
76
77
77
78
78
79
Capítulo 6
79
80
80
81
81
82
2 65 ms 106 ms
10 353 ms 1342 ms
20 708 ms 1975 ms
50 1745 ms 4012 ms
100 2900 ms 7600 ms
300 9253 ms 9996 ms
500 10652 ms 13056 ms
Tabela 6.1: Tabela comparativa na aplicação que utiliza Spring
Spring – Usuário/Tempo
Tempo (ms)
14000
12000
10000
8000 Série1
6000 Série2
4000
2000
0
0 200 400 600
Usuários
Por sua vez, a tabela 6.2 e a figura 6.4 demonstram os resultados obtidos pela
aplicação usando EJB.
82
83
2 327 ms 255 ms
10 767 ms 1360 ms
20 1071 ms 2253 ms
50 3500 ms 4234 ms
100 7038 ms 7632 ms
300 10447 ms 12983 ms
500 14523 ms 13678 ms
EJB – Usuário/tempo
Tempo (ms)
16000
14000
12000
10000
Série1
8000
Série2
6000
4000
2000
0
2 10 20 50 100 300 500
Usuários
Com a realização dos testes, pôde-se notar que não há uma grande diferença
entre a performance das duas aplicações. É importante salientar que os testes
foram realizados em computadores comuns. Foi usado um Notebook Apple Power
Book 1,64 GHz com 512 MB de Memória, e um Notebook Toshiba 2,3 GHz com 512
83
84
84
85
Conclusão
85
86
Referências Bibliográficas
[BEC1996] BECK, Kent. Smalltalk Best Pratice Patterns. 1.ed. Prentice Hall
PTR, 1996, 240 p.
[CRI2000] CRISPIN, Lisa; WADE, Carol. The Need for Speed: Automating
Acceptance testing in an Extreme Programming Environment.
Disponível em:
<http://www.soft.com/QualWeek/QWE2K/Papers.pdf/Crispin.pdf>.
Acesso em: Dezembro de 2005.
86
87
[HAR2005] HARROP, Rob; MACHACEK, Jan. Pro Spring. Apress. 2005, 832 p.
87
88
88
89
89
90
[SUN2006] BALL, Jennifer; CARSON, Debbie Bode; EVANS, Ian; HAASE, Kim;
JENDROCK, Eric. The Java EE 5 Tutorial. Disponível em:
<http://java.sun.com/javaee/5/docs/tutorial/doc/>. Acesso em:
Fevereiro de 2006.
90