gostaria de algum comentário, sugestão de um Web Site Java
Estou utilizando um Cloud Server da TeHospedo
SO: CentOS 6 64bits, acho que o processador é de um núcleo 2.4GHz, 2Gb Ram, Banda 20Mbps.
Server http: Apache: 2.3 rodando porta 80
Server JSP: TomCat 7.0.19 rodando na porta 8080
BD: Postgre 8.4
JRE: 6.0.26
O meu projeto utiliza:
Conexão nativa com o banco JDBC.
VRaptor 3.3.1
Tiles 2.2.2
Creio que em determinado momento posso ter mais de 100 acessos simultâneos no sistema.
Minhas perguntas.
Meu servidor suporta atender mais de 100 acessos simultâneos?
Tem como eu melhorar ele?
Quando recebo uma requisição primeiro ela passa pelo apache e este encaminha para o tomcat. Vale apena isso, ou seria melhor parar o apache e colocar o tomcat de cara na internet na porta 80?
se o motivo pra não usar JPA/Hibernate for performance, vc otimizou o lugar errado… o JPA/Hibernate tem umas estratégias de cache (1o e 2o nível) que podem melhora mto mais a sua performance do que usar jdbc puro na unha.
se vc precisa de performance, use o VRaptor com o Guice (só remover os jars do spring, e colocar os do guice)
a escalabilidade do sistema é mto mais do que o hardware e os frameworks utilizados.
o que vc pode fazer num primeiro momento é configurar caches, pool de conexões, memória da VM, parâmetros do servidor etc com valores razoáveis (não existem números mágicos pra isso)…
a partir do momento que vc conhecer o padrão de uso da aplicação vc tuna os valores pros que forem mais adequados.
achei que tava fazendo bom negócio tirando o hibernate da camada de persistência, fiz isso também porque já tive problema em inserir no banco com uma sessão e em outra sessão simultânea o dado inserido não apareceu, tive que restartar o servidor para aparecer. Então acho que ainda tenho que aprender muito sobre cache do hibernate.
Umas perguntas:
Memória da VM é no JRE, certo?
Pool de conexões é no postgre ou na minha aplicação?
memória da VM é da JVM (que faz parte da JRE)… a memória padrão pra uma VM é um pouco baixa (tipo 256MB) e dá pra aumentar facilmente…
pool de conexões é na aplicação… se vc usa jdbc direto vc vai ter que fazer isso na mão, se for com o hibernate é só habilitar o c3p0
o cache que eu falei é o do hibernate…
isso do dado não aparecer em sessões simultâneas pode ser resolvido com estratégias de transação, ou com locks (otimista ou pessimista)…
use o hibernate… tuná-lo é mto mais fácil do que fazer tudo na mão e o resultado geralmente é melhor
Para ter idéia de como sua aplicação vai se comportar com determinada quantidade de requisições, você pode usar o JMeter ou o Apache Bench (mais conhecido como ab).