Problema de performace - Relatorio(jasper) acessando banco Access usando RMI

1 resposta
rollei

Pessoal, estou com problemas de perfomace, com diz o titulo, na geracao de um relatorio. Seguinte, no Ireports, quando eu ponho para gerar o relatorio pela ferramenta ele nao demora mais do que 2-5 segundos, na minha aplicacao java ele jah demora BEM MAIS para gerar o relatorio e quando eu coloco a aplicacao para acessar o banco usando o driver RMI, demora mais ainda ao ponto de expirar e nao mostrar o relatorio. Por enquanto o banco e a aplicacao estao na minha maquina, to usando o RMI meramente para efeitos de teste, porque futuramente a aplicacao vai estar numa maquina e o banco em outra.

No fim das contas queria algumas dicas para melhorar a perfomace da aplicacao. O select eh meio pesado porque ele usa alguns LIKEs. Se alguem tiver alguma dica de como mudar o select ou alguma coisa no codigo eu agradeco ... ou alguma maneira diferente de fazer o que eu estou fazendo sem usar LIKE por exemplo ... qualquer dica eu agradeco.

primeiro, vamos ao select de um dos relatorios ... acredito que esse seja o segundo relatorio mais pesado da aplicacao, soh sao 2 relatorios realmente pesados. esses parametros do relatorio que ta usando para fazer comparacao estao vindo de inputs texto de uma pagina WEB.

SELECT
	SIS."Nome da Aplicação" AS NOMEAPLICACAO ,
	SIS."Descrição Sucinta" AS DSCSUCINTA    ,
	ORG.SIGLA               AS SIGLAORGAO    ,
	BAN.banco               AS BANCO         ,
	LIN.linguagem           AS LINGUAGEM     ,
	PLA.plataforma          AS PLATAFORMA    ,
	TIP.tipo                AS TIPO          ,
	STA.status              AS STATUS        ,
	SIS.Observacao          AS OBSERVACAO    ,
	SIS.ceder               AS CEDER
FROM
	SISTEMAS   AS SIS ,
	banco      AS BAN ,
	linguagem  AS LIN ,
	Tipo       AS TIP ,
	orgao      AS ORG ,
	plataforma AS PLA ,
	status     AS STA

WHERE
	SIS.isn_orgao      = ORG.isn_orgao                                    AND
	SIS.isn_Tipo       = TIP.isn_Tipo                                     AND
	SIS.isn_plataforma = PLA.isn_plataforma                               AND
	SIS.isn_banco      = BAN.isn_banco                                    AND
	SIS.isn_linguagem  = LIN.isn_linguagem                                AND
	SIS.isn_status     = STA.isn_status                                   AND
	UCASE(SIS."Nome da Aplicação") LIKE UCASE($P{PARAMETRONOMEAPLICACAO}) AND
	UCASE(SIS."Descrição Sucinta") LIKE UCASE($P{PARAMETRODSCSUCINTA})    AND
	UCASE(ORG.SIGLA)               LIKE UCASE($P{PARAMETROORGAO})         AND
	UCASE(BAN.banco)               LIKE UCASE($P{PARAMETROBANCO})         AND
	UCASE(LIN.linguagem)           LIKE UCASE($P{PARAMETROLINGUAGEM})     AND
	UCASE(PLA.plataforma)          LIKE UCASE($P{PARAMETROPLATAFORMA})    AND
	UCASE(TIP.tipo)                LIKE UCASE($P{PARAMETROTIPO})          AND
	UCASE(STA.status)              LIKE UCASE($P{PARAMETROSTATUS})
ORDER BY
	SIS."Nome da Aplicação"

vamos as classes agora:

public class ConnectionFactory {
	
	public static Connection getConnectionAccess() {
		try {
			Class.forName(BancoAccess.getForNameAccess());
			return DriverManager.getConnection(BancoAccess.getDriverAccess());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static Connection getConnectionAccessRmi() {
		try {
			Class.forName(BancoAccessRmi.getForNameAccessRmi()).newInstance();
			return DriverManager.getConnection(BancoAccessRmi.getDriverAccessRmi(),
											   BancoAccessRmi.getDbUserAccessRmi(),
											   BancoAccessRmi.getDbPassAccessRmi());
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}
public class DAO {
	
	protected Connection connection;
	
	public Connection getConnection() {
		return connection;
	}
	
	public void connectionClose () {
		try {
			this.connection.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}
public class AccessRmiDAO extends DAO{
	
	public AccessRmiDAO() {
		this.connection = ConnectionFactory.getConnectionAccessRmi();
	}
	
}
public class RelatorioCatalogoSistemas extends HttpServlet{

	private static final long serialVersionUID = -433379001619945275L;

	@SuppressWarnings("unchecked")
	protected void service(HttpServletRequest req, HttpServletResponse res)
	throws ServletException, IOException {
		
		JasperReport jasperReport = null;
		byte[] pdfRelatorioCatalogoSistemas = null;
		String sep = File.separator;
		
		AccessRmiDAO dao = new AccessRmiDAO();
		
		String pathJasper = getServletContext().getRealPath(
				"/content/reports/") + sep;
		String pathImages = getServletContext().getRealPath(
				"/content/images/") + sep;
		//String path = getServletContext().getRealPath("/");
		
		Map parametros = new HashMap();
		parametros.put("IMAGES_URI"              , pathImages);
		parametros.put("PARAMETRONOMEAPLICACAO"  , "%" + req.getParameter("nomeAplicacao")    + "%");
		parametros.put("PARAMETRODSCSUCINTA"     , "%" + req.getParameter("descricaoSucinta") + "%");
		parametros.put("PARAMETROORGAO"          , "%" + req.getParameter("orgao")            + "%");
		parametros.put("PARAMETROBANCO"          , "%" + req.getParameter("banco")            + "%");
		parametros.put("PARAMETROLINGUAGEM"      , "%" + req.getParameter("linguagem")        + "%");
		parametros.put("PARAMETROPLATAFORMA"     , "%" + req.getParameter("plataforma")       + "%");
		parametros.put("PARAMETROTIPO"           , "%" + req.getParameter("tipo")             + "%");
		parametros.put("PARAMETROSTATUS"         , "%" + req.getParameter("status")           + "%");
		
		try {
			jasperReport = (JasperReport) JRLoader.loadObject(pathJasper+"RelatorioCatalogoSistema.jasper");
			pdfRelatorioCatalogoSistemas = JasperRunManager.runReportToPdf(jasperReport, parametros, dao.getConnection());
		} catch (JRException e1) {
			e1.printStackTrace();
		}
		
		System.out.println("CaminhoJasper: " + pathJasper);
		System.out.println("JasperReport : " + jasperReport);
		System.out.println("Parametros   : " + parametros);
		System.out.println("Pdf          : " + pdfRelatorioCatalogoSistemas);
		
		//Parametros para nao fazer cache e o que será exibido..  
		res.setContentType("application/pdf");  
		res.setHeader("Cache-Control", "no-store");  
		res.setHeader("Pragma", "no-cache");  
		res.setDateHeader("Expires", 0);  
		           
		//Envia para o navegador o pdf..  
		ServletOutputStream servletOutputStream = res.getOutputStream();  
		servletOutputStream.write(pdfRelatorioCatalogoSistemas);  
		servletOutputStream.flush();  
		servletOutputStream.close();
		
		dao.connectionClose();
	}
}

e aqui o jsp com o formulario, eh soh um teste, bem simples, pretendo, logico, mudar ele depois

<%@ page 	language="java"
			pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<html>
	<head>
		<base href="<%=basePath%>">
    
		<title>Catálogo de Sistemas em Órdem Alfabética</title>
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">	
		<meta http-equiv="description" content="Catálogo de Sistemas">
	
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
	</head>
  
	<body>
		<p>Catálogo de Sistemas</p>
    	<form action="<%=path%>/Relatorio/RelCatalogoSistemas" method="post">
      		<table border="0">
        		<tr>
          			<td>Nome Aplica&ccedil;&atilde;o: <br /></td>
          			<td><input type="text" name="nomeAplicacao"></td>
        		</tr>
        		<tr>
          			<td>Descri&ccedil;&atilde;o Sucinta: <br /></td>
          			<td><input type="text" name="descricaoSucinta"></td>
        		</tr>
        		<tr>
          			<td>&Oacute;rg&atilde;o: <br /></td>
          			<td>
          				<input type="text" name="orgao">
          			</td>
        		</tr>
        		<tr>
          			<td>Banco: <br /></td>
          			<td>
          				<input type="text" name="banco">
          			</td>
        		</tr>
        		<tr>
          			<td>Linguagem: <br /></td>
          			<td>
	          			<input type="text" name="linguagem">
					</td>
				</tr>
				<tr>
					<td>Plataforma: <br /></td>
					<td>
						<input type="text" name="plataforma">
					</td>
				</tr>
				<tr>
					<td>Tipo: <br /></td>
					<td><input type="text" name="tipo"></td>
				</tr>
				<tr>
					<td>Status: <br /></td>
					<td><input type="text" name="status"></td>
				</tr>
				<tr>
					<td colspan="2" align="right"><input type="submit" value="Submit"></td>
				</tr>
			</table>
		</form>
	</body>
</html>

[]'s

**edit**
Esqueci de mencionar processador e memoria da maquina que to usando para desenvolvimento. É um pentium 4 3.0 GHz usando windows xp sp2.

1 Resposta

rollei

Alguem pode passar uma pagina boa explicando a sintaxe do banco Access?? Queria fazer uma mudanca na query e nao sei como ou se da para fazer isso.

Colocar uma condicao antes de cada like, para esse soh fazer o like se o parametro nao for nulo. Tem como fazer isso? Como?

Criado 23 de abril de 2008
Ultima resposta 23 de abr. de 2008
Respostas 1
Participantes 1