Olá pessoal. Tenho uma aplicação Java+Flex+BlazeDS que acessa um banco MySQL por mei do HIbernate/JPA. Localmente o acesso ao banco está normal, mas quando eu hospedei esta aplicação na Locaweb, percebi uma grande lentidão nas consultas feitas ao banco, a principio pensei que o problema estava na locaweb, mas depois de alguns teste verifiquei que o responsável é o Flex com BlazeDS, pois criei a mesma consulta utilizando JSP e o resulta bem rápido. Eu preciso utilizar o Flex, alguém sabe como eu posso resolver isso?
Detalha um pouco mais seu problema…
Qual a consulta que está sendo lenta ? Como estão mapeados seus serviços no blazeDS ??
E já te adianto que fatalmente a aplicação em flex tende a ser mais lenta que em jsp, afinal de contas a resposta que um JSP precisa está na requisição que é enviada de volta, já o flex precisa serializar e deserializar os dados que são enviados e recebidos. ( por favor alguem me corrige se eu estiver falando besteira )…
[quote]Detalha um pouco mais seu problema…
[/quote]
services-config.xml:
[code]
<?xml version=“1.0” encoding=“UTF-8”?>
<service id="remoting-service"
class=“flex.messaging.services.RemotingService”>
<adapters>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<destination id="usuario" channels="my-amf">
<properties>
<source>usuario.servicos.UsuarioServico</source>
</properties>
</destination>
<destination id="controlCliente" channels="my-amf">
<properties>
<source>rouparia.servicos.RoupariaService</source>
</properties>
</destination>
<destination id="comissao" channels="my-amf">
<properties>
<source>comissao.servicos.ComissaoServico</source>
</properties>
</destination>
</service>[/code]
arquivo.mxml:
<mx:RemoteObject id="roFuncXC" destination="controlCliente" showBusyCursor="true" >
<mx:method name="buscaPorNomeFunc" result="resultBuscaPorNomeFunc(event)" />
</mx:RemoteObject>
//Método que acessa o objeto remoto
private function buscaGeral():void{
if( cbBusca.value == "Nome funcionario"){
roFuncXC.buscaPorNomeFunc( tiBusca.text + "%" );
}else if(cbBusca.value == "Cliente"){
roFuncXC.buscaPorClienteFunc( tiBusca.text + "%" );
}
}
//resultado
private function resultBuscaPorNomeFunc(event:ResultEvent):void{
if(event.result != null){
listFunc = event.result as ArrayCollection;
}else{
listFunc = new ArrayCollection();
}
}
acesso ao baco:
//Somente para teste
public List<FuncXContrato> buscaPorNomeFunc(String nome){
List<FuncXContrato> list = new ArrayList<FuncXContrato>();
Connection conexao=null;
String sql;
try {
conexao = ConnectionMySql.getConnection();
sql = "select * from funcxcontrato where nome like ?";
PreparedStatement stmt = conexao.prepareStatement(sql);
stmt.setString(1, nome);
rs = stmt.executeQuery();
while( rs.next()){
FuncXContrato fxc = new FuncXContrato();
fxc.setCod_func(444422 );
fxc.setContrato("");
fxc.setCliente(rs.getString("cliente"));
fxc.setNome(rs.getString("nome"));
fxc.setArmario("");
fxc.setGaveta("");
fxc.setObs("");
fxc.setLavand("");
fxc.setNro_chapa(10);
fxc.setCentro_custo("");
fxc.setDt_nasc(rs.getDate("dt_nasc"));
fxc.setSetor("");
fxc.setDescr_setor("");
fxc.setLoja("");
fxc.setDt_deslig(rs.getDate("dt_deslig"));
fxc.setTurno("");
fxc.setDt_admissao(rs.getDate("dt_admissao"));
fxc.setTerceiro("");
fxc.setMatr_cliente("Matricuila");
fxc.setUsuario(new Usuarios());
fxc.setFilial("");
list.add(fxc);
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
}
}
remoting-config.xml:
[code]
<?xml version=“1.0” encoding=“UTF-8”?>
<service id="remoting-service"
class=“flex.messaging.services.RemotingService”>
<adapters>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
</adapters>
<default-channels>
<channel ref="my-amf"/>
</default-channels>
<destination id="usuario" channels="my-amf">
<properties>
<source>usuario.servicos.UsuarioServico</source>
</properties>
</destination>
<destination id="controlCliente" channels="my-amf">
<properties>
<source>rouparia.servicos.RoupariaService</source>
</properties>
</destination>
<destination id="comissao" channels="my-amf">
<properties>
<source>comissao.servicos.ComissaoServico</source>
</properties>
</destination>
</service>[/code]
Para se ter uma idéia esta mesma consulta localmente demora menos de um segundo, no provedor demora quase 25 segundo.
[quote=Omeganosferatu]Detalha um pouco mais seu problema…
Qual a consulta que está sendo lenta ? Como estão mapeados seus serviços no blazeDS ??
E já te adianto que fatalmente a aplicação em flex tende a ser mais lenta que em jsp, afinal de contas a resposta que um JSP precisa está na requisição que é enviada de volta, já o flex precisa serializar e deserializar os dados que são enviados e recebidos. ( por favor alguem me corrige se eu estiver falando besteira )…[/quote]
Acredito que você não esteja falando besteira não.
Só não entendi uma coisa: primeiramente foi falado em Hibernate depois foi postado um código com jdbc. Com o Hibernate o problema pode estar nos Lazy. A serialização pode estar demorando.
Mesmo sendo em jdbc também pode esta acontecendo o problema de demora na serialaação pela quantidade de dados.
Pootz cara, realmente deve ter alguma coisa errada por ai, eu não consegui identificar pelo seu código.
Pra você ter uma ideia, atualmente estou trabalhando num projeto com Flex acessando um banco sqlServer e consumindo WS de outros servidores, a coisa é um pouco lenta, mas nem tanto…
Já tentou fazer os 2 testes no servidor? 1 utilizando jsp e outro com o flex ?
Talvez pode ser algum problema no seu link … sei lá … qualquer novidade vai postando ai que a gente ve o que consegue descobrir…
[]s
Já fiz este teste e não tem nem comparação, com jsp o resultado é na hora. segue os links:
nome para consulta: "maria"
http://www.alscocrm.com.br/crm/teste.html
http://www.alscocrm.com.br/crm/mysqljava.jsp
Eu usei jdbc para eliminar a suspeita com o Hibernate.
Pelos links que você mandou os dois resultados foram instatâneos aqui.
Aqui também foi na hora … quase que instantaneo … tanto pra maria, sergio… digitei no text field e cliquei em buscar e o resultado foi na hora …
Da uma olhada em como seu teste ta sendo feito ai … aqui foi bem rapido…
Agora eu não entendi nada, acessei por outra máquina aqui na rede da empresa e o acesso via flex continua lento.
Mas valeu pessoal força.
Acho que pode ser o link de vocês ai … da uma checada depois … ou na versão do flash player dos browsers…
abraço
Aqui foi bem ligeiro também…
Faz um tracert pro ip pra ver o que acontece.
Cara aki foi instantaneo as 2 buscas, verifique fora da empresa tmb para vc ver o resultado.
So uma Duvida, vc esta usando Blaze-Ds direto com Hibernate???
No Hibernate vc esta usando EntityManager ou Session??
estou usando BlazeDs acessando direto minhas Daos, no hibernate e esta dando um consumo de memoria violento no tomcat, no caso estou usando EntityManager.
Sim estou usando direto com hibernate com EntityManager. Na verdade é JPA implementado pelo Hibernate.
Sobre o problema da lentidão, eu testei lá em casa e foi rápido também mas aqui na empresa fica lento mesmo, e olha que a velocidade do link é muito boa.
Acho que não necessidade de usar o tracert porque o acesso via jsp é rápido, o problema deve estar relacionado com o BalzeDS mesmo. Não faço dem idéa do que está acontecendo aqui…Bom vou deixar isto para lá.
Você está usando pool de conexões ?
Sim estou usando direto com hibernate com EntityManager. Na verdade é JPA implementado pelo Hibernate.
[/quote]
Cara, e vc esta usando Algum Singleton para gerenciar o EntityManagerFactory, o meu esta um por classe, pois o singleton que implementei nao tava adiantando pois instanciava o singleton novamente.
No Caso Usei Este
public final class PersistenceUtil {
private static Logger logger = Logger.getLogger(PersistenceUtil.class);
private static final String UNIT_NAME = "ticket-s";
private static EntityManagerFactory FACTORY;
public static final ThreadLocal<EntityManager> SESSION = new ThreadLocal<EntityManager>();
public static EntityManager currentEntityManager() {
logger.debug("** Chamou o currentEntityManager");
EntityManager manager = (EntityManager) SESSION.get();
if (manager == null) {
logger.debug("Manager Null");
loadInstance();
manager = FACTORY.createEntityManager();
SESSION.set(manager);
}
return manager;
}
public static void closeEntityManager() {
EntityManager manager = (EntityManager) SESSION.get();
if (manager != null) {
manager.close();
}
SESSION.set(null);
}
private static synchronized void loadInstance() {
logger.debug("** Criou a o EMF");
if (FACTORY == null) {
FACTORY = Persistence.createEntityManagerFactory(UNIT_NAME);
}
}
}
Vc tem como postar uma classe sua que utiliza Entity Manager para que eu possa ter uma ideia.
[quote]Vc tem como postar uma classe sua que utiliza Entity Manager para que eu possa ter uma ideia.
[/quote]
[code]
package persistencia;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManager;
public class HibernateUtil_MySQL {
private static EntityManagerFactory emf;
public static EntityManagerFactory getEmf() {
if (emf == null){
synchronized (HibernateUtil_MySQL.class) {
if (emf == null)
try {
Logger.getLogger(HibernateUtil_MySQL.class).info(">>>EntityManagerFactory criado!");
emf = Persistence.createEntityManagerFactory("unit_name");
} catch (RuntimeException ex) {
Logger.getLogger(HibernateUtil_MySQL.class).fatal("não foi possível carregar a unidade de persistencia", ex);
throw ex;
}
}
}
return emf;
}
public static EntityManager createEm() {
try {
return getEmf().createEntityManager();
} catch (RuntimeException ex) {
Logger.getLogger(HibernateUtil_MySQL.class).error("falha ao criar EntityManager", ex);
throw ex;
}
}
public static Session createSession() {
return ((HibernateEntityManager)createEm()).getSession();
}
}[/code]
Sim e estou usando JNDI configurado na locaweb
[code]package persistencia;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManager;
public class HibernateUtil_MySQL {
private static EntityManagerFactory emf;
public static EntityManagerFactory getEmf() {
if (emf == null){
synchronized (HibernateUtil_MySQL.class) {
if (emf == null)
try {
Logger.getLogger(HibernateUtil_MySQL.class).info(">>>EntityManagerFactory criado!");
emf = Persistence.createEntityManagerFactory("name_unit");
} catch (RuntimeException ex) {
Logger.getLogger(HibernateUtil_MySQL.class).fatal("não foi possível carregar a unidade de persistencia", ex);
throw ex;
}
}
}
return emf;
}
public static EntityManager createEm() {
try {
return getEmf().createEntityManager();
} catch (RuntimeException ex) {
Logger.getLogger(HibernateUtil_MySQL.class).error("falha ao criar EntityManager", ex);
throw ex;
}
}
public static Session createSession() {
return ((HibernateEntityManager)createEm()).getSession();
}
}[/code]
Sim estou usando JNDI
[code]package persistencia;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.ejb.HibernateEntityManager;
public class HibernateUtil_MySQL {
private static EntityManagerFactory emf;
public static EntityManagerFactory getEmf() {
if (emf == null){
synchronized (HibernateUtil_MySQL.class) {
if (emf == null)
try {
Logger.getLogger(HibernateUtil_MySQL.class).info(">>>EntityManagerFactory criado!");
emf = Persistence.createEntityManagerFactory("name_unit");
} catch (RuntimeException ex) {
Logger.getLogger(HibernateUtil_MySQL.class).fatal("não foi possível carregar a unidade de persistencia", ex);
throw ex;
}
}
}
return emf;
}
public static EntityManager createEm() {
try {
return getEmf().createEntityManager();
} catch (RuntimeException ex) {
Logger.getLogger(HibernateUtil_MySQL.class).error("falha ao criar EntityManager", ex);
throw ex;
}
}
public static Session createSession() {
return ((HibernateEntityManager)createEm()).getSession();
}
}[/code]
Sim estou usando JNDI[/quote]
Valeu Fera, muito bom esse singleton, mais eu queria um exemplo de classe ue utiliza-se ele, ou utiliza-se os Session e melhor ainda se pudesse dar um exemplo das duas
Mais de qualquer forma valeus
Desculpe amigo mas eu não temho um exemplo usando session, vou ficar de devendo.
[code]
public List<FuncXContrato> teste(String nome){
try {
EntityManager em2 = HibernateUtil_MySQL.createEm();
Query q = em2.createQuery(“select f from FuncXContrato f " +
” where nome like :nome order by nome ");
q.setParameter(“nome”, nome);
List<FuncXContrato> listClientes = q.getResultList();
//Para resolver o problema com o Lazy
if( listClientes.size() >= 1){
Iterator it = listClientes.iterator();
while (it.hasNext()) {
FuncXContrato fxc = (FuncXContrato) it.next();
//Inicializa as permissões do grupo
Hibernate.initialize( fxc.getPecasFunc());
}
}else{
return null;
}
em2.close();
return listClientes;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
}
}[/code]
Referente ao problema de lentidão que eu estava tendo consegui resolver. O problema era o comprimento do nome do médoto, por exemplo estava usando: buscaPorNomeDoCliente( String nome) e então mudei para buscaPNC(String nome) e aí ficou rápido. O que eu não entendo é porque isto acontecia somente dentro da rede da empresa onde eu trabalho.