Arquivos

Posts Tagged ‘JAVA’

Criando um projeto Java que conecta no Derby

Segue um breve tutorial sobre como criar uma aplicação Java que se conecta no Derby e o manipula.

1- Baixe a versão mais recende do Derby em http://db.apache.org/derby/derby_downloads.html
Existe a distribuição binária (bin distribution) que além das bibliotecas requeridas, tras documentação, exemplos, etc. Eu costumo baixar a Lib distribution, que contem somente os JARS necessários.

2- Descompacte o arquivo baixado. Veja que existe um diretório LIB nele. Lá estarão as bibliotecas que utilizaremos em seguida.

3- É opcional, mas eu prefiro criar uma pasta em meu projeto chamada Derby e copiar os arquivos do Derby para dentro da mesma, assim, ao levar o projeto para outras máquinas, o banco vai junto. Criada a pasta, os dois arquivos necessários são:

  • derby.jar
  • derbytools.jar

4- Adicione os dois Jars copiados em seu ClassPath, para isso, clique com o botão direito no projeto e vá em propriedades, então em Java Build Path, e na Aba Libraries, clique em Add Jars e apontar o local onde estão os dois arquivos.

Feito isso, vamos para o código. Criei uma classe chamada TesteDerby no pacote br.com.tix11.programs , ele foi baseado na documentação oficial do Derby. A classe tenta se conectar num banco Derby, vê se o db ESCOLA existe, caso não exista o cria e popula e faz um select simples. Segue o conteúdo:

Feito isso, vamos para o código. Criei uma classe chamada TesteDerby no pacote br.com.tix11.programs , ele foi baseado na documentação oficial do Derby. A classe tenta se conectar num banco Derby, vê se o db ESCOLA existe, caso não exista o cria e popula e faz um select simples. Segue o conteúdo:

package br.com.tix11.programs;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.apache.derby.tools.ij;

public class TestDerby {

	private static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
	private static String protocol = "jdbc:derby:";

	public static void main(String args[]) {
		if (checkDB())
		{
			System.out.println("BANCO ESTA PRONTO PARA O USO.");
		} else
		{
			System.out.println("BANCO NAO ESTÁ OPERACIONAL.");
		}
	}

	public static boolean checkDB() {
		boolean retorno = false;
		loadDriver();
		Connection conn = null;

		ArrayList statements = new ArrayList(); // list of Statements,
												// PreparedStatements
		Statement s = null;
		ResultSet rs = null;
		try
		{
			String dbName = "ESCOLA"; // the name of the database
			// caso DB não exista, ele cria
			conn = DriverManager.getConnection(protocol + dbName + ";create=true");
			System.out.println("Connected to and created database " + dbName);

			// Imprimindo o conteudo da tabela disciplina
			s = conn.createStatement();
			rs = s.executeQuery("SELECT * FROM ESCOLA.discipline");
			while (rs.next()){
				System.out.println(rs.getInt(1) + " - " + rs.getString(2));
			}
			

			// Efetuando shutdown no DERBY
			try
			{
				DriverManager.getConnection("jdbc:derby:;shutdown=true");
			} catch (SQLException se)
			{
				if (((se.getErrorCode() == 50000) && ("XJ015".equals(se.getSQLState()))))
				{
					System.out.println("Derby shut down normally");
				} else
				{
					System.err.println("Derby did not shut down normally");
					printSQLException(se);
				}
			}

		} catch (SQLException sqle)
		{
			// Caso eu nao encontre o banco ou a tabela, eu os crio. Deve passar aqui somente na primeira execussao
			printSQLException(sqle);
			if  ( ( sqle.getMessage().equalsIgnoreCase("Table/View 'ESCOLA.discipline' does not exist.")) || (sqle.getMessage().equalsIgnoreCase("Schema 'ESCOLA' does not exist")) )
			{
				System.out.println("Ill create the database.");
				if (createDB(conn))
				{
					System.out.println("Banco Criado");
					System.out.println("Populando Banco");
					if (populateDB(conn))
					{
						System.out.println("Banco nao pode ser populado");
					} else
					{
						System.out.println("Banco populado");
						retorno = true;
					}
				} else
				{
					System.out.println("Banco não pode ser criado");
				}

			}
		} finally
		{
			// release all open resources to avoid unnecessary memory usage
			try
			{
				if (rs != null)
				{
					rs.close();
					rs = null;
				}
			} catch (SQLException sqle)
			{
				printSQLException(sqle);

			}

			// Statements and PreparedStatements
			int i = 0;
			while (!statements.isEmpty())
			{
				// PreparedStatement extend Statement
				Statement st = (Statement) statements.remove(i);
				try
				{
					if (st != null)
					{
						st.close();
						st = null;
					}
				} catch (SQLException sqle)
				{
					printSQLException(sqle);
				}
			}

			// Connection
			try
			{
				if (conn != null)
				{
					conn.close();
					conn = null;
				}
			} catch (SQLException sqle)
			{
				printSQLException(sqle);
			}
		}
		return retorno;
	}

	/**
	 * Cria a tabela
	 * @param conn
	 * @return
	 */
	private static boolean createDB(Connection conn) {
		FileInputStream fileStream = null;
		try
		{
			fileStream = new FileInputStream("./scripts/create.sql");
			int result = ij.runScript(conn, fileStream, "UTF-8", System.out, "UTF-8");
			System.out.println("Result code is: " + result);
			if (result == 1)
			{
				return true;
			} else
			{
				return false;
			}
		} catch (FileNotFoundException e)
		{
			return false;
		} catch (UnsupportedEncodingException e)
		{
			return false;
		} finally
		{
			if (fileStream != null)
			{
				try
				{
					fileStream.close();
				} catch (IOException e)
				{
				}
			}
		}
	}

	/**
	 * Popula a tabela
	 * @param conn
	 * @return
	 */
	private static boolean populateDB(Connection conn) {
		FileInputStream fileStream = null;
		try
		{
			fileStream = new FileInputStream("./scripts/populate.sql");
			int result = ij.runScript(conn, fileStream, "UTF-8", System.out, "UTF-8");
			System.out.println("Result code is: " + result);
			if (result == 1)
			{
				return true;
			} else
			{
				return false;
			}
		} catch (FileNotFoundException e)
		{
			return false;
		} catch (UnsupportedEncodingException e)
		{
			return false;
		} finally
		{
			if (fileStream != null)
			{
				try
				{
					fileStream.close();
				} catch (IOException e)
				{
				}
			}
		}
	}

	private static void loadDriver() {
		try
		{
			Class.forName(driver).newInstance();
			System.out.println("Loaded the appropriate driver");
		} catch (ClassNotFoundException cnfe)
		{
			System.err.println("\nUnable to load the JDBC driver " + driver);
			System.err.println("Please check your CLASSPATH.");
			cnfe.printStackTrace(System.err);
		} catch (InstantiationException ie)
		{
			System.err.println("\nUnable to instantiate the JDBC driver " + driver);
			ie.printStackTrace(System.err);
		} catch (IllegalAccessException iae)
		{
			System.err.println("\nNot allowed to access the JDBC driver " + driver);
			iae.printStackTrace(System.err);
		}
	}

	private static void reportFailure(String message) {
		System.err.println('\t' + message);
	}

	public static void printSQLException(SQLException e) {
		while (e != null)
		{
			System.err.println("\n----- SQLException -----");
			System.err.println("  SQL State:  " + e.getSQLState());
			System.err.println("  Error Code: " + e.getErrorCode());
			System.err.println("  Message:    " + e.getMessage());
			e = e.getNextException();
		}
	}

}

Repare que eu criei dois scripts SQL, um que cria a tabela que utilizaremos para teste e outro que a popula. Então, no exemplo JAVA você verá dois métodos sendo invocados caso necessário, para chamar respectivamente os scripts que criam e populam a tabela. Dentro do projeto tem uma pasta chamada scripts, e nela, os dois scripts.

create.sql

CREATE TABLE "ESCOLA".discipline
(
  id numeric(10) NOT NULL,
  "NAME" character varying(100) NOT NULL
);

populate.sql

INSERT INTO "ESCOLA".discipline (id, name) VALUES (1, 'Module 1');
INSERT INTO "ESCOLA".discipline (id, name) VALUES (2, 'Module 2');
INSERT INTO "ESCOLA".discipline (id, name) VALUES (3, 'Module 3');
CategoriasJAVA Tags:, , , ,

Executar um script no Derby via Java

É comum a necessidade de executarmos um script para manipulação do Derby, por exemplo, criação de tabelas, povoar, etc, dentro de nosso programa Java.

Escrevi um método bem simples que pode ser utilizado como base, espero que seja útil, ai vai:

private static boolean populateDB(){
   FileInputStream fileStream = null;
   try {
      String protocol = "jdbc:derby:";
      String dbName = "IVELA";
      conn = DriverManager.getConnection(protocol + dbName + ";create=true");
      fileStream = new FileInputStream("C:\\Program Files\\English4Smart\\database\\populate.sql");
      int result = ij.runScript(conn, fileStream, "UTF-8",System.out, "UTF-8");
      System.out.println("Result code is: " + result);
      if (result == 1){
         return true;
      } else {
         return false;
      }
   } catch (Exception e) {
      return false;
   } catch (FileNotFoundException e) {
      return false;
   } catch (UnsupportedEncodingException e) {
      return false;
   } finally {
      if (fileStream != null) {
         try {
            fileStream.close();
         } catch (IOException e) 
         {
         }
      }
   }
}
CategoriasJAVA Tags:, , ,

Criando um projeto WEB com Jetty

Segue um breve how to cujo objetivo é mostrar como embutir o Jetty no seu projeto e criar um Servlet exemplo.

1- Baixe o Jetty e o jar javax.servlet. Verifique pelas ultimas versões disponíveis, no momento que escrevia este How To, eram os abaixo:

http://repo1.maven.org/maven2/org/eclipse/jetty/aggregate/jetty-all/8.1.9.v20130131/jetty-all-8.1.9.v20130131.jar

http://repo2.maven.org/maven2/org/eclipse/jetty/orbit/javax.servlet/3.0.0.v201112011016/javax.servlet-3.0.0.v201112011016.jar

2- Iniciei um projeto Java normal no eclipse e adicione as duas libs como dependencia.

3- Crie uma classe para ser a classe principal que iniciará o Jetty:

package br.com.infoserver.exemplo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

import br.com.infoserver.servlets.DummyServlet;
import br.com.infoserver.servlets.DummyServlet2;

public class ExemploJetty extends AbstractHandler{

public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("<h1>Hello World</h1>");
}

public static void main(String[] args) throws Exception
{
Server server = new Server(8080);

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);

context.addServlet(new ServletHolder(new DummyServlet()),"/*");
context.addServlet(new ServletHolder(new DummyServlet("Servlet 1")),"/servlet1/*");

server.start();
server.join();
}

}

4- Crie o Servlet:

package br.com.infoserver.servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DummyServlet extends HttpServlet
{
private static final long serialVersionUID = -7433379500358268888L;

public DummyServlet(){}
public DummyServlet(String greeting)
{
this.greeting=greeting;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("session=" + request.getSession(true).getId());
}
}

5- Execute a classe principal, e no seu navegador aponte para localhost:8080/servlet1

Voa lá!

CategoriasJAVA Tags:, , ,

Criando uma aplicação Java conversando com Filas MQ

Galera, achei uma fonte muito legal sobre o tema Java e WebSphere MQ, segue ai:

http://www.angusyoung.org/2011/10/23/tutorial-sobre-websphere-mq/

Fazendo submit de um form com Ajax

Para quem quer fazer um submit de um form, sem reload de página, eis um link interessante:

http://net.tutsplus.com/tutorials/javascript-ajax/submit-a-form-without-page-refresh-using-jquery/

Enjoy!

CategoriasJAVA Tags:, ,

Fazendo um forward para um JSP de um Servlet

Eu sempre esqueço isso!!! Como efetuar um forward, ou seja, invocar uma página, a partir de um Servlet. Segue o código:


RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/meetingsearch.jsp");
dispatcher.forward(request, response);

Enjoy!

CategoriasJAVA Tags:, , , ,

Removendo acentuação com Java

Segue código exemplo para referência utilizando replaceAll:


public static String removerAcentos(String s) {
s = s.replaceAll("[èéêëÈÉÊË]","E");
s = s.replaceAll("[ûùúÛÙÚ]","U");
s = s.replaceAll("[ïîíìÏÎÍÌ]","I");
s = s.replaceAll("[àâáãÀÂÁÃ]","A");
s = s.replaceAll("[óòÒÓôÔõÕ]","A");
s = s.replaceAll("[ç,Ç]","C");

return s;
}

A tempo, no Java 6 dá pra se utilizar o Normalizer, mais eficiente e simples. Segue Exemplo abaixo:

 


package br.com.infoserver.tests;

import java.text.Normalizer;

public class TestString {

public static void main(String[] args) {
System.out.println(removerAcentos("REALIZÁVEL LONGO PRAZO"));
System.out.println(removerAcentos("ATIVO NÃO CIRCULANTE"));
System.out.println(removerAcentos("AC -Aplicações interf de liquidez"));
System.out.println(removerAcentos("Títulos e vals mobs"));
System.out.println(removerAcentos("RL -Aplicações interf de liquidez"));
System.out.println(removerAcentos("RL - Títulos e vals mobs"));
System.out.println(removerAcentos("PASSIVO NÃO CIRCULANTE"));
System.out.println(removerAcentos("EXIGÍVEL LONGO PRAZO"));
System.out.println(removerAcentos("RES.EXERC.FUTURO"));
System.out.println(removerAcentos("PARTICIP.MINORITÁRIOS"));
System.out.println(removerAcentos("PATRIMÔNIO LÍQUIDO"));
System.out.println(removerAcentos("PC - Total de depósitos"));
System.out.println(removerAcentos("PC - Captações no mercado"));
System.out.println(removerAcentos("EXIGÍVEL A LONGO PRAZO"));
System.out.println(removerAcentos("EX.LP - Total de depósitos"));
System.out.println(removerAcentos("EX.LP - Captações no mercado"));
System.out.println(removerAcentos("EX.LP - Empréstimos e repasses"));
System.out.println(removerAcentos("DEMONSTRATIVO DE RESULTADOS"));
}

public static String removerAcentos(String str) {
str = Normalizer.normalize(str, Normalizer.Form.NFD);
str = str.replaceAll("[^\\p{ASCII}]", "");
return str;
}
}

Enjoy!

CategoriasJAVA Tags:, , ,

Quartz + Tomcat ou Qualquer Servidor de App

Este é um passo a passo de como criar uma aplicação Web que tem uma tarefa agendada. Por exemplo, vamos supor que você tem uma aplicação Web, que eventualmente deve efetuar uma limpeza de dados em uma base. Você pode utilizar o quartz para isso (outra alternativa seria Ejb timer). Vamos la:

1- Baixe o Quartz (http://www.quartz-scheduler.org/)
2- Crie um projeto Web Dinâmico no Eclipse e nas dependencias do mesmo, coloque todas as bibliotecas do Quartz baixadas no passo anterior.
3- Crie as classes abaixo:
3.1- Tarefa

package com.br.infoserver.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * Esta classe demonstra uma tarefa que ira ser invocada pelo Quartz
 * Tem que implementar a interface Job do Quartz
 * @author julianom
 */
public class TarefaExemplo implements Job{
	/**
	 * Metodo que é executado quando a tarefa é invocada
	 */
	public void execute(JobExecutionContext context)
	throws JobExecutionException {
		// aqui vai a lógica da tarefa a ser chamada,
		// por exemplo, fazer um select no banco e enviar algum dado para uma fila MQ
		// Neste exemplo, vai somente imprimir no console a data de hoje no intervalo de 5 segundos
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy – hh:mm:ss");
		System.err.println("Rodou: " + dateFormat.format( new Date() ));
	}
}

3.2- Agendador, esta classe será invocada por um servlet na inicialização da aplicação WEB

package com.br.infoserver.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Esta é a classe que deve ser invocada e irá disparar a tarefa nos momentos
 * determinados
 *
 * @author julianom
 *
 */
public class Agendador {

	public static void inicia() throws Exception {
		// Detalhes da tarefa
		JobDetail job = JobBuilder.newJob(TarefaExemplo.class).withIdentity(
				"tarefaAloMundo", "group1").build();
		// Gatilho - ou seja, quando irá chamar, neste caso, a cada 5 segundos
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
				"gatilhoAloMundo", "group1").withSchedule(
				CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

		// Agenda e voa lá!
		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();
		scheduler.scheduleJob(job, trigger);

	}

}

4- Crie um servlet, este Servlet deverá ser configurado para ser carregado na inicialização da aplicação, eu fiz isso utilizando annotation, dependendo de sua versão de Java, Apache, WebSphere, etc… vai ter que tirar do Servlet e colocar no arquivo web.xml

package com.br.infoserver.quartz.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.br.infoserver.quartz.Agendador;

/**
 * Servlet implementation class QuartzServlet
 */
@WebServlet(
		urlPatterns = { "/QuartzServlet" },
		initParams = {
				@WebInitParam(name = "load-on-startup", value = "2")
		})
public class QuartzServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public QuartzServlet() {
        super();
		try {
			Agendador.inicia();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

Pronto, simples e fácil. Basta efetuar o deploy de sua aplicação em seu servidor, e verá que neste exemplo ele ficará escrevendo a data no SystemOut do mesmo!

Enjoy!

Criando uma tarefa Agendada no Java com Quartz

Eventualmente temos a necessidade de ter um aplicativo Java que irá rodar seguindo uma determinada agenda, por exemplo, de 10 em 10 minutos, todos dia as 18 horas, etc…

Quartz é um componente que nos permite fazer isso com facilidade. Para criar uma aplicação simples, basta baixar o mesmo de quartz-scheduler.org , e criar uma aplicação com as libs do quartz no classpath da mesma, e ter pelo menos duas classes, uma que representa a TAREFA, e outra que representa a AGENDA. Seguem os exemplos:

- Tarefa

package com.br.infoserver.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * Esta classe demonstra uma tarefa que ira ser invocada pelo Quartz
 * Tem que implementar a interface Job do Quartz
 * @author julianom
 *
 */
public class TarefaExemplo implements Job{

/**
 * Metodo que é executado quando a tarefa é invocada
 */
 public void execute(JobExecutionContext context)
 throws JobExecutionException {
 // Obviamente, aqui vai a lógica da tarefa a ser chamada, nesta caso, vai imprimir no console
   SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy – hh:mm:ss");
   System.out.println("Rodou: " + dateFormat.format( new Date() ));
 }

}

- Agenda

package com.br.infoserver.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Esta é a classe que deve ser invocada e irá disparar a tarefa nos momentos
 * determinados
 *
 * @author julianom
 *
 */
public class Agendador {

	public static void inicia() throws Exception {
		// Detalhes da tarefa
		JobDetail job = JobBuilder.newJob(TarefaExemplo.class).withIdentity(
				"tarefaAloMundo", "group1").build();
		// Gatilho - ou seja, quando irá chamar, neste caso, a cada 5 segundos
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
				"gatilhoAloMundo", "group1").withSchedule(
				CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();

		// Agenda e voa lá!
		Scheduler scheduler = new StdSchedulerFactory().getScheduler();
		scheduler.start();
		scheduler.scheduleJob(job, trigger);

	}

}

Finalmente, a classe principal que invoca a agenda:

package com.br.infoserver.quartz;
/**
 * Classe principal da aplicação que dispara as agendas
 * @author julianom
 *
 */
public class IniciaAgenda {

	public static void main(String[] args) {
		try {
			Agendador.inicia();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Enjoy!

CategoriasJAVA Tags:, , , ,

Obtendo melhor desempenho em aplicações SQL

Eventualmente vemos queixas da lentidão na execussão de Stored Procedures ou selects em geral em nossas aplicações Java, PHP, etc. Muitos fatores podem colaborar para que o desempenho seja pífio e é possível escrever um livro a respeito. De qualquer forma, vou compartilhar a seguir algumas dicas que podem ajudar. A tempo, acreditem, ainda que as pessoas saibam do que vou falar a seguir, parece que ninguem lembra no momento de implementar uma aplicação. Vamos lá:

1- Criar indices adequados
Quando temos uma busca, por exemplo: select max(data_inclusao) from tabela , vemos que o banco irá fazer uma busca pela maior data de inclusão na Tabela. Se este campo não for indice, ele varrerá toda a tabela até encontrar o maior. Caso você crie um indice para o campo, a busca irá ser muito mais rapida, podendo ser otimizada ainda mais se o indice a ser criado NESTE CASO for descendente, ou seja, do maior para o menor.

2- Comparações adequadas
Temos que dar preferência a utilizar nas clausulas “where” os indices citados acima. Caso um where demande uma busca que não seja por um indice, obviamente será muito mais lento devido a leitura que o banco irá efetuar na tabela.

3- Buffer Pool
Está é uma configuração do tanto de memória (RAM) que o banco irá utilizar. Quanto maior, mais espaço o banco terá para trabalhar com os dados em memória RAM, fazendo menos acessos ao disco (muito mais lento). Um valor aceitável para um banco de dados, é ter 95% de acerto em memória.

4- Sort Heap
É o espaço em memória disponível para o banco fazer sorts, deve ser estabelecido um valor adequado para evitar estouros de memória. Assim como o buffer pool, é um ajuste fino e vai sendo adequado de acordo com o uso da aplicação, observando-se os logs e solicitando análises de desempenho ao DBA.

5- Rotinas de expurgo
Quanto mais registros temos em uma tabela, mais trabalho o sgbd terá para encontrar informações. Uma boa prática é criar rotinas nos sistemas para expurgar dados históricos, ou seja, criar tabelas “mortas”, cuja finalidade é guardar histórico e remover estes dados se não forem necessários em tabelas quentes.

6- Particionamento de tabelas
Relacionado ao ítem anterior, se não pudermos limpar uma tabela e ela realmente tenha muitos dados, um boa idéia é particionar a mesma utilizando algum critério inteligente, por exemplo, suponha que você tenha uma tabela de VENDAS, podemos particionar a mesma num critério parecido com o abaixo:
A- Vendas realizadas a partir de 2010
B- Vendas realizadas entre 2000 e 2010
C- Vendas realizadas entre 1990 e 2000
D- Vendas realizadas antes de 1990

7- Select *
SEMPRE escreva suas buscas limitando o número de colunas, trazendo somente os dados necessários.
Limite tambem o número de linhas retornadas, sempre utilizando filtros nas clausulas WHERE.
Caso não tenha um filtro, por exemplo: o usuário não informou NOME, ENDERECO, CNPJ, ETC, para buscar um cliente, traga somente um número limitado de linhas. OBRIGUE seu usuário a utilizar critérios. É inadimissivel um “select *” em uma base de dados, ainda mais, sem Where.

8- Organização da procedure
Tenha em mente que toda clausula sql é “compilada” e o banco gera um plano de acesso para executar a mesma. Supondo que você tenha uma Stored Procedure que, dependendo dos parametros de entrada, não irá fazer chamadas a determinadas tabelas, por exemplo, se o usuário não informar a cidade do cliente, a sql não irá fazer um join com a tabela cidades. Agora imagine que em sua tabela você tem TODAS as cidades do Brasil cadastradas. Ganhamos desempenho se não envolver tal tabela na consulta (é um exemplo bobo, mas pode ser utilizado em outras escalas)!

Veja o exemplo abaixo, ele faz exatamente o que falo no ítem anterior:

CREATE PROCEDURE DBAPRD1.PSELXIMBICA(
IN PAR_CIDADE                varchar(10)
)
SPECIFIC DBAPRD1.PSELXIMBICA
DYNAMIC RESULT SETS 1

P1:BEGIN
-- declaro dois cursores, criando dois planos de acesso
DECLARE cursorListagem CURSOR WITH RETURN TO CLIENT FOR
SELECT
nome,
endereco
FROM DBAPRD1.CLIENTES;
-- este utiliza a tabela cidade, sendo bem mais lento
DECLARE cursorListagem2 CURSOR WITH RETURN TO CLIENT FOR
SELECT
A.nome,
A.endereco
FROM DBAPRD1.CLIENTES A, DBAPRD1.CIDADES B
WHERE   B.cidade LIKE PAR_CIDADE;

IF PAR_CIDADE IS NULL THEN
OPEN cursorListagem;
ELSE
OPEN cursorListagem2;
END IF;
END P1@

Enjoy!

CategoriasJAVA Tags:, , , , ,
Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 138 outros seguidores