Arquivos da categoria: Principal

Um pouco sobre Multitenancy

No último semestre do curso tivemos as apresentações dos trabalhos finais. Na ocasião, comentei um pouco sobre multitenancy e seus impactos em uma aplicação java já existente, propondo um framework que facilite a adaptação e programação nessa situação. O Hibernate 4 já possui algo desenvolvido nesse sentido, dando suporte a multitenancy com bases de dados separadas, mas parece que vários avanços estão por vir, podendo até ter suporte a multitenancy com a base de dados compartilhada.

Em anexo a este post, está uma versão em PDF do Trabalho de Conclusão de Curso, onde pode-se encontrar mais informações a respeito do assunto.

Injeção de Dependência: comparação de desempenho

No presente post procurar-se-á demonstrar uma comparação entre injeção de dependência de dois grandes Frameworks, o JSF e o Spring. Para efeito de comparação também foi testada uma versão do aplicativo web com JSF sem o uso de injeção de dependência.

No desenvolvimento Web, diferentemente do desenvolvimento de aplicativos para Desktop, os sistemas muitas vezes possuem dezenas de milhares de usuários simultaneamente, isso exige um grande desempenho das aplicações.

Sendo assim a verificação do desempenho de diferentes formas de implementações, utilizando JSF com e sem injeção de dependência, que é uma forma de IoC (Inversion of Control – Inversão de Controle), e Spring, é importante e aponta para possibilidades mais adequadas, considerando as diferenças de desempenho entre os frameworks citados.

Os sistemas serão submetidos a testes de stress e desempenho. Para realização desses testes foi utilizado a ferramenta JMeter, uma ferramenta que diante das crescentes necessidades por performance vem sendo muito utilizada. Apache JMeter pode ser usado para testar o desempenho tanto em recursos estáticos quanto dinâmicos (arquivos, Servlets, scripts Perl, Java Objects, Bases de Dados, Consultas SQL, servidores FTP e muito mais).

Para o presente trabalho foram realizados dois testes para cada sistema desenvolvido, primeiro com 1000 usuários e o segundo com 4000 usuários. Esses dois testes foram realizados da mesma maneira com os três sistemas desenvolvidos (Spring com IoC, JSF com e sem IoC). Foram realizados testes com o máximo de 4000 mil usuários pois, o sistema após esse número apresentava a exceção “java.lang.OutOfMemoryError: Java heap apace” tornando impossível a realização de testes com maior número de usuários.

Como pode ser visto logo abaixo, o JMeter permite entre outras características as seguintes:

Tempo da amostra – tempo de resposta da aplicação;

Desvio – dispersão dos valores em relação à média;

Porcentagem de erro – porcentagem de problemas nas respostas;

Vazão – o número de operações que o sistema é capaz de completar em um dado período de tempo;

Carga Máxima do servidor – uso do processador pelo servidor;

Memória Máxima do servidor – uso de memória pelo servidor.

Tabela 1: Comparativo de desempenho com 1000 threads

Item Spring JSF com IoC JSF sem IoC
Tempo da amostra 75ms 74ms 39ms
Desvio 49ms 40ms 19ms
% de erro 0 % 0% 0%
Vazão 19,8/seg 19,8/seg 19,8/seg
Carga Máx. servidor ~37% ~60% ~50%
Memória Máx. servidor ~75% ~100% ~98%

 

Tabela 2: Comparativo de desempenho com 4000 threads

Item Spring JSF com IoC JSF sem IoC
Tempo da amostra 41ms 39ms 39ms
Desvio 89ms 25ms 18ms
% de erro 0%  0% 0%
Vazão 18,1/seg 19,6/seg 19,8/seg
Carga Máx. servidor ~48% ~35% ~48%
Memória Máx. servidor 95% ~80% ~90%

Através dos dados obtidos com os testes é possível identificar onde cada abordagem de desenvolvimento obteve um melhor desempenho com respeito à performance. Na tabela 1 e 2, foram agrupados os principais quesitos com respeito ao desempenho da aplicação para que pudéssemos analisar de forma mais clara.
Tempo da Amostra – Com relação a tempo, que seria o tempo de resposta da aplicação, na tabela acima temos a média de cada um. Observamos que o JSF sem Injeção de Dependência obteve resultados um pouco melhores, sendo em média mais rápido.
A porcentagem de erro ou problemas ao acessar a aplicação foi de zero por cento em todas as abordagens apresentadas.
A Vazão não foi muito diferente entre um e outro ficando novamente o JSF sem IoC um pouco à frente dos demais, mas apenas no teste com 4000 usuários, sendo praticamente insignificante a diferença haja vista que a própria rede pode apresentar oscilações na transferência de dados.
Agora com relação ao servidor de aplicações Tomcat, a carga do sistema obteve resultados na faixa de 35% a 60%, entretanto, não somos capazes de inferir nada com relação, pois em todos os testes houve oscilações durante o intervalo observado, sendo, que o Spring conseguiu se manter mais estável. Com relação ao uso da memória também não houve muita diferença.
Os testes foram realizados com o grupo máximo de 4000 usuários devido a estouro de memória no sistema quando utilizado por um grupo maior de usuários, apresentando a seguinte exceção: “java.lang.OutOfMemoryError: Java heap apace”. Com o número de usuários máximo utilizado nos testes, embora tenha havido algumas diferenças nos resultados, os sistemas se comportaram bem, não gerando gargalos nem indisponibilidade. Podemos perceber diante disso que com a melhora cada vez maior das técnicas de desenvolvimento de Frameworks e linguagens de programação o nível de qualidade se mantém quase igual, claro havendo algumas metodologias e facilidades diferenciadas em cada um.

CONCLUSÃO

Com todas as metodologias e técnicas utilizadas atualmente no desenvolvimento de ferramentas para auxílio dos programadores de sistemas, e até mesmo a maior especialização e estudo por parte das pessoas envolvidas nesse processo de desenvolvimento, tornou-se possível, excluindo algumas especificidades, que os níveis dessas ferramentas, como já dito anteriormente, quanto a desempenho se tornem muito parecidas, não havendo uma diferença muito grande.

O presente trabalho mostrou exatamente que as funcionalidades básicas, como é o caso da injeção de dependência, já estão bem consolidadas na maior parte dos Frameworks, logo, salvo funcionalidade muito específica, que seja provida por apenas um Framework, qualquer um dos Frameworks demonstrados aqui seria muito importante para um sistema em desenvolvimento e não haveria grandes problemas por adotar um ou outro, notando apenas que a injeção de dependência é um padrão de projeto e como tal já foi provado por anos de experiência em desenvolvimento de software, que é a forma mais indicada para desenvolvimento de sistemas complexos por facilitar muito o trabalho, tendo sido utilizada uma versão sem injeção de dependência no trabalho apenas por questões comparativas (mesmo que fosse muito mais eficiente não seria indicada por muitos outros fatores).

 

Injeção de Dependência no JSF 2

Como  já  é  do  conhecimento  de  qualquer  desenvolvedor,  cada  classe  em  Java  possui características  específicas  possuindo  seus  atributos  próprios  e  métodos  relacionados  com  suas características e funcionalidades  que precisará realizar. Em  qualquer  aplicação  Orientada  a  Objetos  muitas  vezes  é  necessário  que  uma  classe  use serviços de outras classes. Para que ocorra essa troca de funcionalidades é preciso que uma classe possua a referência da outra classe que deseja usar. Normalmente faríamos isso instânciando a classe ou seja daríamos um ‘new’ no nosso objeto, entretanto hoje será mostrada uma forma para se fazer isso através da Injeção de Dependência do JSF.

Um bom motivo para usarmos Injeção de Dependência em nosso projeto é o desacoplamento do nosso código,  facilidade para reuso e também facilidade para realizar testes.

A  partir  do  JSF  2  isso  ficou  muito  mais  simples  de  ser  feito,  podemos  usar  a  Injeção de Dependência  disponibilizada  por  ele  apenas  utilizando  anotações  em  cima  das  nossas  classes,  abaixo segue uma exemplificação de como podemos fazer isso:

@ManagedBean(name="veiculo")
@ApplicationScoped
public class VeiculoDaoImpl implements VeiculoDao{

//Atributos
//Métodos

//Gets e Sets

}

Primeiramente, damos um nome para no ManagedBean, no exemplo chamamos de veiculo mas pode ser qualquer nome. Esse ManagedBean é a classe que queremos usar, ou seja, queremos injetar essa classe para que a outra classe possa se utilizar de suas funcionalidades.
Note que VeiculoDao é apenas uma interface nela apenas colocamos as assinaturas dos métodos que vamos posteriormente implementar na classe VeiculoDaoImpl, é extremamente importante de criarmos uma interface para cada classe, pois o JSF injeta apenas as os métodos que estão declarados nas interfaces.
Por fim precisamos apenas injetar a classe VeiculoDaoImpl, para isso procedemos da seguinte forma:

@ManagedBean(name="vendaController")
@ApplicationScope
public class VendaController implementes Serializable{

@ManagedProperty(value="#{veiculo}")
private VeiculoDao veiculoDao;

//Gets e Sets

}

Esse segundo ManagedBean é onde nós iremos injetar a nossa classe VeiculoDaoImpl, para fazer isso apenas utilizamos a anotação @ManagedProperty e na propriedade value colocamos o nome dado anteriormente ao nosso ManagedBean, ou seja, “veiculo” outro detalhe importante é criar os Gets e Sets para a classe a ser injetada. Pronto com apenas algumas linhas acabamos de realizar a injeção de dependência do JSF 2.

Cursores em MySql

No desenvolvimento e manutenção de sistemas, é comum que apareçam algumas funcionalidades ou mudanças que impliquem em alterar a estrutura existente do banco de dados. Nos sistemas que já estão em produção, já não se pode mais eliminar a base de dados e iniciar novamente, pois não podemos deixar que os dados do cliente “desapareçam”.

Em muitas dessas modificações de estrutura do banco, é necessário “transferir” dados de determinadas tabelas para outras, ou fazer alguma operação para que a nova estrutura do banco de dados também se adapte ao sistema. Uma das formas para se efetuar esses ajustes é programando e executando scripts SQL.

Para tratar de uma coleção de dados(vinda de um select, por exemplo), nos utilizamos de cursores. Tive a necessidade de ajustar uma base de dados MySql, e tive de escrever uma rotina para se utilizar de duas tabelas e gerar dados para uma outra tabela. Achei um tanto burocrático, sem contar que nem o exemplo contido na documentação funcionou.

A fim de evitar que passem pelas mesmas dificuldades que passei, vou disponibilizar a estrutura com a qual tive sucesso.

delimiter ;
drop procedure if exists insereDados;

delimiter |

create procedure insereDados()
 begin

 DECLARE done INT DEFAULT 0;
 DECLARE var1, var2, var3 BIGINT;

 DECLARE curs CURSOR FOR (
	SELECT dado1, dado2, dado3 FROM TABELA
	);

 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

 OPEN curs;

 REPEAT

 	FETCH curs INTO var1, var2, var3;
		IF NOT done THEN
			INSERT INTO OUTRA_TABELA(campo1, campo2, campo3) VALUES(var1, var2, var3);
		END IF;
 UNTIL done END REPEAT;

 CLOSE curs;

 end
|

delimiter ;

call insereDados();
drop procedure if exists insereDados;

 

Lembrando que a ordem de declaração de delimitadores, variáveis e cursores deve ser seguida rigorosamente. Vale lembrar também que estaremos criando uma procedure (que para funcionar deverá ser chamada), portanto ela ficará armazenada no banco, a menos que você exclua ela. Para resolver isto, aproveitei e criei mais duas linhas(as duas últimas) onde estou chamando a procedure criada e depois de sua execução estou eliminando-a.

Um post rápido que espero que sirva de ajuda para quem precisa fazer coisas mais “cabulosas” com o banco de dados MySql.

Personalizar Tema PrimeFaces

logo-jquery

 

 

 

 

 

 

Uma dica muito interessante para quem usa PrimeFaces. Navegando, hoje no site do Jquery, encontrei um recurso para personalizar os temas do PrimeFaces, com ele é possível editar desde fonte, as cores dos temas e até mesmo mudar o formato dos cantos dos componentes de acordo com o seu gosto e depois de criado o novo tema é só realizar o download e usar em seus projetos.

Para quem interessar segue o link do Jquery.

Personalizando Select com JQuery

Muitas vezes nos deparamos com situações que exigem o uso da propriedade select em algum projeto web. As vezes o projeto exige dos programadores que o select seja mais elaborado ou diferenciado.
Nos padrões do HTML temos um select com poucas alternativas de customização, o que, em muitos casos não vem acalhar com as nossas reais necessidades de personalização.
Quando tudo esta difícil na web aparece o JQuery para resolver a nossa vida. O plugin Custom Select trás toda a flexibilidade para adaptarmos o nosso select da forma que for necessário.

Exemplo do select no código HTML:

<select name="dormitorios"  title="Exemplo:">
    <option value="1">1 exemplar</option>
    <option value="2">2 exemplar </option>
    <option value="3">3 exemplar </option>
    <option value="4">4 exemplar </option>
    <option value="5">5 exemplar </option>
</select>

Vamos para a configuração:

1 – Baixar a biblioteca principal do JQuery  jquery.tools.min.js

2 -Baixar o plugin jquery.customselect.js

3 – Chamar os arquivos js em seu html:

<script type="text/javascript" src="/path/to/jquery-1.4.2.min.js"></script>
<script type="text/javascript" src="jquery.customselect.js"></script>

4 – Inserir em seu código HTML a função que executa o nosso plugin;

<script type="text/javascript">
$(document).ready(function(){
    $('#select').SelectCustomizer();
});
</script>

 

CSS do select

Propriedade 1 – _iconselect

Vai ser a primeira parte do nosso select, onde se localizarão configurações como: tamanho da fonte, tipo de fonte, background do campo, entre outros.

Esta propriedade _iconselect é um sufixo gerado pelo próprio plugin.

Ex: A sua configuração no CSS ficará assim:

select_iconselect {
...
}

Propriedade 2 – _options

Esta propriedade é responsável pela configuração da nossa caixa de itens, ou seja, propriedades como tamanho da caixa, barra de rolagem entre outras. A propriedade no código CSS ficará assim:

select_options {
...
}

 

Propriedade 3 – selectwrapper e selectfooter

Esta propriedade vai configurar todos os itens do nosso select em associação com outras propriedades.

Aqui vai alguns códigos que serão relacionados com essa propriedade para a personalização do nosso select no CSS:

.selectwrapper {…}
.selectwrapper .selectitems{...}
.selectwrapper .last{...}
.selectwrapper .selectitems span{...}
.selectwrapper .hoverclass {...}
.selectwrapper .selectedclass {…}

Também temos a propriedade selectfooter que como o próprio nome induz, faz referencia a configurações do nosso rodapé, da caixa de itens.
No código CSS ficará assim:

.selectfooter {…}

Abaixo a imagem de um select personalizado:

OBS: Lembrando que estas propriedades são geradas automaticamente pelo nosso plugin. Por isso não incluímos nem uma dessas classes ao nosso HTML, apenas a propriedade select em sua forma natural.

p:graphicImage não atualiza com ajax…

Mais uma dica rápida e interessante, dessa vez na área de JSF, para quem programa utilizando Primefaces…

Às vezes temos alguma(s) imagen(s) em nossos cadastros(por exemplo, a foto de um cliente). Para renderizar as imagens na tela, utilizamos o componente <p:graphicImage />.

Acontece que se, caso quisermos atualizar a imagem utilizando ajax, a imagem insiste em não atualizar. Problema de sete cabeças?? Não!!

Eis o macete: o componente p:graphicImage possui um atributo chamado cache, que por default está setado como true. Ou seja, quando mandamos atualizar com ajax, a imagem será resgatada do cache. Então, para conseguirmos atualizar a imagem com ajax, setamos o atributo cache=”false”, obrigando a atualização da imagem e a correta exibição.

É isso aí pessoal, até a próxima!!

Evitando erro de “Wrong permissions on configuration file” no XAMPP

Muita gente(inclusive eu…), após instalar o XAMPP no seu linux, altera as permissões de todos os arquivos do XAMPP e deixa tudo com permissão total para todos (777). E na hora de dar um “start” no serviço mysql ou acessar o phpMyAdmin recebe uma bela mensagem que diz “Wrong permissions on configuration file, should not be world writable!”.

Que bonito!! É uma bela reclamação para o nosso chmod com permissão 777. E agora, como arrumar isso??

Não sei o seu caso, mas para mim foi simples. Ao iniciar, o phpMyAdmin necessita que pelo menos dois arquivos não estejam editáveis. São eles: “config.inc.php” e “my.cnf”. Para resolver, dei permissão 644 para esses dois arquivos e … feitooooo!!! O phpMyAdmin voltou a funcionar.

Por hoje é só, pessoal! Até a próxima.

Tutorial de instalação do SDK Android com Eclipse no Linux.

Em primeiro lugar, o download deve ser efetuado em http://developer.android.com/sdk/index.html, selecione o arquivo referente a plataforma utilizada (Windows, Linux ou Mac) e clique em “I agree to the terms of the SDK License Agreement” para aceitar os termo da licença do SDK e logo a após pressione o botão Download. Abaixo os comandos no modo console para efetuar a descompactação do arquivo SDK e execução do Android.

$ tar -zxvf android-sdk_r04-linux_86.tgz
$ cd android-sdk-linux_86/tools
$ ./android

Sugiro adicionar na variável ambiental PATH a pasta TOOLS do pacote Android SDK. Basta inserir no arquivo ~/.bashrc uma linha informando a localização das ferramentas do Android. A seguir um exemplo da linha a ser adicionada:

export PATH=${PATH}:<pasta de instalação do android>/tools

Ao executar o comando ./android, se tudo estiver funcionando corretamente, teremos um formulário similar ao da figura abaixo:

Linux: Instalando o Android SDK na plataforma Linux.

Adicione os componentes no SDK e clique na opção Avaliable Packages e selecione a plataforma desejada (Android 1.1, 1.5, 1.6, 2.0, 2.1… ). Caso ocorra problemas de conexão, habilite o uso forçado https selecionando a opção Settings e Force https. E repita a operação.

Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.

Na janela de diálogo, clique em Accept e no botão Install Accept.

Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.

Instalação do Eclipse

A instalação do Eclipse pode ser efetuada no link http://www.eclipse.org/downloads/, com a extração do .tar.gz ou a utilização do YaST (na distribuição openSUSE) e seleção dos pacotes RPM. Selecione primeiramente o pacote eclipse e pressione o botão Aceitar.

Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.

Instalando o plugin do Eclipse (ADT – Android Development Tools):

No meu caso estou utilizando o Eclipse 3.5. Entretanto na página oficial do Android é mencionada a compatibilidade com diversas versões. Para iniciar a instalação do plugin ADT, abra o Eclipse, selecione o item Help do menu principal, logo após o subitem “Install New Software”.

Linux: Instalando o Android SDK na plataforma Linux.

Clique no botão “ADD…” para adicionar o site.

Linux: Instalando o Android SDK na plataforma Linux.

Adicione o Google plugin for Eclipse, no meu caso utilizei o site http://dl.google.com/eclipse/plugin/3.5.

Linux: Instalando o Android SDK na plataforma Linux.

Selecione todas as opções (Google Plugin Eclipse, Google App Engine Java e Google Web Toolkit).

Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.

Repita a operação adicionando o site do ADT (Android Development Tools) digitando o endereço https://dl-ssl.google.com/android/eclipse/ e adicione ambos os pacotes.

Linux: Instalando o Android SDK na plataforma Linux.
Linux: Instalando o Android SDK na plataforma Linux.

Configure o Android selecionando o item Windows e clique na opção preferences.

Linux: Instalando o Android SDK na plataforma Linux.

Configure a localização do SDK e clique no botão “APPLY”.

Linux: Instalando o Android SDK na plataforma Linux.
PRONTO agora o seu sdk já esta configurado e pronto para o uso
Adaptado do artigo  Instalando o Android SDK na plataforma Linux disponivel em http://www.vivaolinux.com.br/artigo/Instalando-o-Android-SDK-na-plataforma-Linux?pagina=1