JAVA SQLException spowalnia działanie programu.

0

Czesć! Pisze program bazodanowy w javie pobierający ogromne ilości danych. Problem w tym, że czas pomiędzy wysłaniem zapytania a pobraniem danych jest bardzo duży (nawet 5 minut czekania).
OK, no to do rzeczy.

Aktualna wersja:

/**
* Klasa do pobierania danych z BD.
*/
class KlasaA{
	ArrayList<String> pobierzA(){
		try(){
			resultSet = statement.executeQuery("SELECT A FROM tabelkaA");
			while(resultSet.next()){
				arrayList.addElement(resultSet.getString("A"));
			}
		}catch(SQLException ex){/*...*/}
	}
	ArrayList<String> pobierzB(){
		try(){
			resultSet = statement.executeQuery("SELECT B FROM tabelkaB");
			while(resultSet.next()){
				arrayList.addElement(resultSet.getString("B"));
			}
		}catch(SQLException ex){/*...*/}
	}
}

// w innym pliku pobieram sobie tymi metodami gotowe kolekcje z danymi.
/**
* Klasa używająca powyższą.
*/
class KlasaB{
	void metodaX(){
	System.out.println(KlasaA.pobierzA());
	}
}

Takich metod mam kilkanaście, i są dość często wywoływane. Niestety try() bardzo mocno spowalnia działanie programu.
Jak to można przyśpieszyć ? Pobranie Danych tylko raz odpada bo w czasie działania programu dane w bazie ulegają zmianie.

1

bardzo watpie ze to try spowalnia prace programu. na czym opierasz swoje przypuszczenia?
co rozumiesz przez ogromne ilosci danych?
zamiast ciagnac wszystkie dane, mozesz pobierac tylko to co sie zmienilo.

0

Gdy umieszcze wszystko w jednym TRY()'u to program potrafi wypluć wszystkie dane w kilka sekund, ale gdy już chcę to spakować w klasy i ładnie poukładać to zaczyna bardzo długo pracować.

to może pokaże cały kod klasy:


import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;


/**
 * Obsługa zapytań do bazy danych.
 */
public class OracleDatabaseQuerrys {
    /**
     * Zwraca rekord
     * @return kolekcja ArrayList
     */
    public ArrayList getResult(){
        //TODO: @i od 0 do np. @getCtype().size()
            //TODO: Select * from @getOwner().get(i) . @getCtable().get(i) WHERE DP_OID= @oID AND DP_CTYPE= @getCtype().get(i);
            //TODO: jeżeli brak elementu wstawiaj null albo " " <-- Zakładamy, że jest tylko jeden wiersz
        return new ArrayList();
    }
    /**
     * Zwrace nazwe kolumn
     * @return kolekcja ArrayList
     */
    public ArrayList getResultColummnName(){
        //TODO:Dorobić metode zwracającą nazwe kolumn;
        ArrayList s = new ArrayList();
        try{
         Statement st = connect.createStatement();
         ResultSet rs = st.executeQuery("a");
         ResultSetMetaData rsmd = rs.getMetaData();
         for(int i = 0 ;i < rsmd.getColumnCount();i++)
         {
             s.add(rsmd.getColumnName(i));
         }
         
        }
        catch(SQLException ex){System.err.println(ex.getMessage());};
        return s;
    }
    /**
     * zwraca Name (nazwy zakładek).
     * @return kolekcja ArrayList 
     */
    public ArrayList getName(){
        ArrayList s = new ArrayList();
        try{
         Statement st = connect.createStatement();
         ResultSet rs = st.executeQuery(QUERRY_D+getOtype());
         while(rs.next()){
         s.add(rs.getString("Name"));
         }
        }
        catch (SQLException ex){System.err.println(ex.getMessage());}
        return s;
    }
    /**
     * Zwraca OType 
     * @return String
     */
    private String getOtype(){
            String s = "";
            try{
             Statement st = connect.createStatement();
             ResultSet rs = st.executeQuery(QUERRY_A+String.valueOf(oID));
             while(rs.next()){
             s += rs.getString("DP_OTYPE");
             }
            }
            catch (SQLException ex){System.err.println(ex.getMessage());}
            return s;
        }
    /**
     * Zwraca kolekcje CType
     * @return Kolekcja ArrayList
     */
    private ArrayList getCtype(){
        ArrayList s = new ArrayList();
        try{
         Statement st = connect.createStatement();
         ResultSet rs = st.executeQuery(QUERRY_B+getOtype());
         while(rs.next()){
         s.add(rs.getString("DP_CTYPE"));
         }
        }
        catch (SQLException ex){System.err.println(ex.getMessage());}
        return s;
    }
    /**
     * Zwraca właścicieli tabeli
     * @return kolekcja ArrayList
     */
    private ArrayList getOwner(){
        ArrayList s = new ArrayList();
        try{
         Statement st = connect.createStatement();
         ResultSet rs = null;
         
         for(int i = 0;i < getCtype().size();i++) {
            rs = st.executeQuery(QUERRY_C+String.valueOf(getCtype().get(i)));
            
            while(rs.next()){
                s.add(rs.getString("OWNER"));
            }
         }
        }
        catch (SQLException ex){System.err.println(ex.getMessage());}
        return s;
    };
    /**
     * Zwraca Ctable
     * @return kolekcja ArrayList
     */
    private ArrayList getCtable(){
        ArrayList s = new ArrayList();
        try{
         Statement st = connect.createStatement();
         ResultSet rs = null;
         
         for(int i = 0;i < getCtype().size();i++) {
            rs = st.executeQuery(QUERRY_C+String.valueOf(getCtype().get(i)));
            
            while(rs.next()){
                s.add(rs.getString("CTABLE"));
            }
         }
        }
        catch (SQLException ex){System.err.println(ex.getMessage());}
   
        return s;
    };
    OracleDatabaseQuerrys(int oID,Connection connect){
        this.oID = oID;
        this.connect = connect;
    }
    private static Connection connect;
    private static int oID;
    private static final String QUERRY_A = "SELECT DP_OTYPE FROM XXX1 WHERE DP_OID =";
    private static final String QUERRY_B = "SELECT DP_CTYPE FROM XXX2 WHERE DP_OTYPE =";
    private static final String QUERRY_C = "SELECT CTABLE, OWNER FROM XXX3 WHERE DP_CTYPE = ";
    private static final String QUERRY_D = "SELECT Name FROM xxx4 WHERE DP_OTYPE =";
    
}

0

ok, ktora z tych metod tak sie wlecze? daj tez kawalek kodu ktory ja wywoluje. nie masz zadnych bledow? jesli leca ci wyjatki to spraw zeby nie lecialy :) wtedy bedzie szybciej dzialalo. nie napisales co rozumiesz przez ogromna ilosc danych

0

Z grubsza widzę tu 2 opcje: albo w tym jest jakaś nieujawniona głęboka koncepcja, albo nie słyszałeś o złączeniach tabel w SQL. ;)

0

popieram ajp, po pierwsze masz tu pozagłębiane bloki try/catch i to jakoś solidnie. Po drugie wygląda to jak byś chciał wyniki jednego zapytania wykorzystać w innym. Do tego służą podzapytania i joiny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1