[RESOLVIDO]Performance!

10 respostas
snowblacksoul

Bom dia galera blz, estou com um grande problema em performance na minha aplicação.
Estou conectando no banco de dados e extraindo as informações e gravando no txt, porém á maquina fica muito lenta
o que posso fazer para melhorar minha aplicação?!?!
grato a ajuda de todos

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author daniel
 */
public class testeb  {

    private static java.sql.Statement st;
    private static int dt_inicio = 20110227;
    private static int dt_fim = 201010;
    private static ResultSet rs;

    private static String diaDoMes;

    public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException, SQLException, ParseException {

       SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
       //GregorianCalendar call = new GregorianCalendar();
        Calendar cal = Calendar.getInstance();
        	int diaDoMes = cal.get(Calendar.DAY_OF_MONTH);
        	int mesAtual = cal.get(Calendar.MONTH);
        	int anoAtual = cal.get(Calendar.YEAR);
        	int hora = cal.get(Calendar.HOUR_OF_DAY);
        	int minuto = cal.get(Calendar.MINUTE);
        	int segundo = cal.get(Calendar.SECOND);

                System.out.println(diaDoMes);
                System.out.println(mesAtual);
                System.out.println(anoAtual);
                System.out.println(hora);
                System.out.println(minuto);
                System.out.println(segundo);
                System.out.println(""+anoAtual+""+mesAtual);

        try{

               Class.forName("oracle.jdbc.OracleDriver");
                    Connection con=  DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g","system","11g");
                    System.out.println("CONECTADO!!!!!");
                    Date inicio = sdf.parse(sdf.format(System.currentTimeMillis()));
                    System.out.println(inicio);

            st = con.createStatement();

            ResultSet rs = st.executeQuery("select * from system.parque_trafego_"+dt_inicio+" where conta = "+dt_fim+" and cod_subtp_produto_comercial = 'LINA'");

            //select * from system.parque_trafego_20110227 where conta = 201010
            
                   File file = new File("C:/Users/daniel/Documents/NetBeansProjects/textoBanco/src/arquivo2.txt");
                   long tamanho = file.length();
                   PrintWriter pw = new PrintWriter(file);

                    while(rs.next()){
                    pw.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
                            rs.getString("sistema"),
                            rs.getString("id_conta"),
                            rs.getString("cod_subtp_produto_comercial"),
                            rs.getString("vl_dlc"),
                            rs.getString("qt_dlc"),
                            rs.getString("qt_sgndo_dlc"),
                            rs.getString("vl_chmda_local"),
                            rs.getString("qt_chmda_local"),
                            rs.getString("qt_sgndo_chmda_local"),
                            rs.getString("conta"),
                            rs.getString("produto_comercial"),
                            rs.getString("terminal"),
                            rs.getString("teste"),
                            rs.getString("valor"));


      System.out.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
                            rs.getString("sistema"),
                            rs.getString("id_conta"),
                            rs.getString("cod_subtp_produto_comercial"),
                            rs.getString("vl_dlc"),
                            rs.getString("qt_dlc"),
                            rs.getString("qt_sgndo_dlc"),
                            rs.getString("vl_chmda_local"),
                            rs.getString("qt_chmda_local"),
                            rs.getString("qt_sgndo_chmda_local"),
                            rs.getString("conta"),
                            rs.getString("produto_comercial"),
                            rs.getString("terminal"),
                            rs.getString("teste"),
                            rs.getString("valor"));

    }
        pw.flush();

       Date fim = sdf.parse(sdf.format(System.currentTimeMillis()));
            System.out.println("*******************************************");
            long teste = fim.getTime() - inicio.getTime();
            System.out.println("teste"+teste);
             System.out.println("Tempo corrido : " +teste/1000/60/60+ ":"+teste/1000/60+"Minuto");
             System.out.println("Desconectado");
        pw.close();
    con.close();
    System.exit(1);
            }catch(SQLException e){
                e.printStackTrace();

         }

      }

  }

10 Respostas

nel

Oi!

  • Não use Statement, use PreparedStatement
  • Nunca esqueça de adicionar o Connection, ResultSet e PreparedStament em um bloco try - finnaly, para realizar o close
  • Remova os System.out.printf() de dentro do While, está fazendo duas vezes os ResultSet com seus respectivos gets
  • Não joga a Query dessa forma. Use o PreparedStatement para setar os valores. Substitua os valores por ‘?’ e use o PreparedStatement para setar os valores necessários

Por fim, talvez seja mais adequado usar um StringBuffer para montar a string que deseja e depois mandar escrever de uma única vez no seu PrintWriter, ao invés de ir escrevendo dentro do While. É uma idéia apenas, teria de testar mesmo.

Abraços.

rogeriopaguilar

O mais simples é substituir a linha

PrintWriter pw = new PrintWriter(file);

por

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(“C:/Users/daniel/Documents/NetBeansProjects/textoBanco/src/arquivo2.txt”)));

sem isso cada vez que vc chama o printf, os dados são convertidos e enviados para o arquivo na hora, sem utilizar nenhum buffer.
Dá uma olhada aqui:

http://download.oracle.com/javase/1.4.2/docs/api/java/io/BufferedWriter.html

alexvingg

Ele ta ficando lento mais na questão de q toda hora que ele ta entrando no while
ele vai pegar seu .txt escrever e fechar faz isso centenas de vezes. Concordo com as
colocações do colega e pra melhorar isso de uma olhada no StringBuffer que vai melhorar
muito em questão de desempenho.

snowblacksoul

Pessoal, vou testar e daqui a pouco dou a resposta a vc´s , valeu galera!

snowblacksoul

haaaaaa como utilizaria o StringBuffer aqui?!

alexvingg
StringBuffer pw = new StringBuffer();
while(rs.next()){  
                    pw.append("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",  
                            rs.getString("sistema"),  
                            rs.getString("id_conta"),  
                            rs.getString("cod_subtp_produto_comercial"),  
                            rs.getString("vl_dlc"),  
                            rs.getString("qt_dlc"),  
                            rs.getString("qt_sgndo_dlc"),  
                            rs.getString("vl_chmda_local"),  
                            rs.getString("qt_chmda_local"),  
                            rs.getString("qt_sgndo_chmda_local"),  
                            rs.getString("conta"),  
                            rs.getString("produto_comercial"),  
                            rs.getString("terminal"),  
                            rs.getString("teste"),  
                            rs.getString("valor"));  
 
    }

Depois vc salva no arquivo.

nel
snowblacksoul:
haaaaaa como utilizaria o StringBuffer aqui?!

Basicamente:

StringBuffer sb = new StringBuffer();
while(rs.next()) {
 sb.append("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",   
rs.getString("sistema"),   
rs.getString("id_conta"));
} 

 pw.printf(sb.toString());
 pw.flush();

Isso para todos os teus gets() do ResulSet.

snowblacksoul

Galera , eu utilizei dessa forma aqui ficou super rápido, valeu mesmo!!!

PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("C:/Users/daniel/Documents/NetBeansProjects/textoBanco/src/arquivo2.txt")));
                while(rs.next()){
                    pw.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
                            rs.getString("sistema"),
                            rs.getString("id_conta"),
                            rs.getString("cod_subtp_produto_comercial"),
                            rs.getString("vl_dlc"),
                            rs.getString("qt_dlc"),
                            rs.getString("qt_sgndo_dlc"),
                            rs.getString("vl_chmda_local"),
                            rs.getString("qt_chmda_local"),
                            rs.getString("qt_sgndo_chmda_local"),
                            rs.getString("conta"),
                            rs.getString("produto_comercial"),
                            rs.getString("terminal"),
                            rs.getString("teste"),
                            rs.getString("valor"));

    }
paulo1911

Olá amigo, fiz um ajuste no seu código, veja e melhora:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @author daniel
 */
public class Teste {

	private static java.sql.Statement st;
	private static int dt_inicio = 20110227;
	private static int dt_fim = 201010;
	private static ResultSet rs;

	private static String diaDoMes;

	public static void main(String[] args) throws ClassNotFoundException,
			FileNotFoundException, SQLException, ParseException {

		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		// GregorianCalendar call = new GregorianCalendar();
		Calendar cal = Calendar.getInstance();
		int diaDoMes = cal.get(Calendar.DAY_OF_MONTH);
		int mesAtual = cal.get(Calendar.MONTH);
		int anoAtual = cal.get(Calendar.YEAR);
		int hora = cal.get(Calendar.HOUR_OF_DAY);
		int minuto = cal.get(Calendar.MINUTE);
		int segundo = cal.get(Calendar.SECOND);

		System.out.println(diaDoMes);
		System.out.println(mesAtual);
		System.out.println(anoAtual);
		System.out.println(hora);
		System.out.println(minuto);
		System.out.println(segundo);
		System.out.println("" + anoAtual + "" + mesAtual);

		try {

			Class.forName("oracle.jdbc.OracleDriver");
			Connection con = DriverManager
					.getConnection("jdbc:oracle:thin:@localhost:1521:orcl11g",
							"system", "11g");
			System.out.println("CONECTADO!!!!!");
			Date inicio = sdf.parse(sdf.format(System.currentTimeMillis()));
			System.out.println(inicio);

			st = con.createStatement();

			ResultSet rs = st
					.executeQuery("select * from system.parque_trafego_"
							+ dt_inicio + " where conta = " + dt_fim
							+ " and cod_subtp_produto_comercial = 'LINA'");

			// select * from system.parque_trafego_20110227 where conta = 201010

			File file = new File(
					"C:/Users/daniel/Documents/NetBeansProjects/textoBanco/src/arquivo2.txt");

			long tamanho = file.length();

			BufferedWriter bw = new BufferedWriter(new FileWriter(file));
			StringBuilder sb = new StringBuilder();

			while (rs.next()) {

				sb.append(rs.getString("sistema"));
				sb.append("\t");
				sb.append(rs.getString("id_conta"));
				sb.append("\t");
				sb.append(rs.getString("cod_subtp_produto_comercial"));
				sb.append("\t");
				sb.append(rs.getString("vl_dlc"));
				sb.append("\t");
				sb.append(rs.getString("qt_dlc"));
				sb.append("\t");
				sb.append(rs.getString("qt_sgndo_dlc"));
				sb.append("\t");
				sb.append(rs.getString("vl_chmda_local"));
				sb.append("\t");
				sb.append(rs.getString("qt_sgndo_chmda_local"));
				sb.append("\t");
				sb.append(rs.getString("conta"));
				sb.append("\t");
				sb.append(rs.getString("produto_comercial"));
				sb.append("\t");
				sb.append(rs.getString("terminal"));
				sb.append("\t");
				sb.append(rs.getString("teste"));
				sb.append("\t");
				sb.append(rs.getString("valor"));
				sb.append("\t");

				System.out.printf(sb.toString());

				bw.write(sb.toString());
				bw.newLine();

			}

			Date fim = sdf.parse(sdf.format(System.currentTimeMillis()));
			System.out.println("*******************************************");
			long teste = fim.getTime() - inicio.getTime();
			System.out.println("teste" + teste);
			System.out.println("Tempo corrido : " + teste / 1000 / 60 / 60
					+ ":" + teste / 1000 / 60 + "Minuto");
			System.out.println("Desconectado");
			bw.close();
			con.close();
			System.exit(1);
		} catch (SQLException e) {
			e.printStackTrace();

		} catch (IOException e) {

			e.printStackTrace();
		}

	}

}

fallow abraço

snowblacksoul

Gente valeu mesmo pela ajuda, melhorou de mais a performance aqui!!
brigadão fiquem com Deus!!!

Criado 11 de agosto de 2011
Ultima resposta 11 de ago. de 2011
Respostas 10
Participantes 5