Avatar billede encorez Juniormester
25. marts 2018 - 15:53 Der er 8 kommentarer og
1 løsning

Genbrug SQL-result mellem classes

Hej
Jeg gennemgår det samme datasæt igen og igen, med ved forskellige parametre. Lige nu udtrækker jeg det samme datasæt fra MySQL, hvilket jo ikke er smart da det er det samme datasæt hver gang.

Lige nu, i FIL1 forberede jeg parametrene og kalder funktionen i FIL2 til at lave analysearbejdet.
Men jeg vil istedet gerne lave SQL udtrækket i FIL1 og så skal funktionen i FIL2 have adgang til det udtræk.

Jeg har forsøgt mig med at lave nogle tests med at lave Public Static variabler, men kan ikke få funktionen i FIL2 til at læse dem.

Jeg har her under skitseret hvordan strukturen i filerne ser ud.

Håber nogen kan fortæller hvordan man knækker den nød :)

FIL1
public class analyse {
public static void main(String[] args) throws ExecutionException, InterruptedException, IOException, ParseException
    {
while (en masse loops){
String test_kombo_result = kombinere.func2(argumenter her);
}
}}

FIL2
public class kombinere {
public static String func2(argumenter){
  String query = "SELECT * FROM .....";
  "Behandler resultat efterfølgende"

}}
Avatar billede encorez Juniormester
25. marts 2018 - 15:59 #1
Jeg fik nu ideen til at flytte public static String func2(argumenter){} ind i FIL1, så virker min simple test.

Meeeen det betyder selvfølgelig også at min FIL1 begynder at blive pæn lang, så jeg vil stadig foretrække at knække koden på at dele en variable mellem classes :)
Avatar billede arne_v Ekspert
25. marts 2018 - 16:04 #2
Hvis data kan vaere i memory maa det vaere ret oplagt at lade 1 laese fra database over i en List<Noget> og saa sende den som argument over i 2.
Avatar billede encorez Juniormester
25. marts 2018 - 16:42 #3
Jeg havde for længere tid siden også overvejet at sende det med over som argument, men var i tvivl om det "kostede" noget i ressourcer, frem for at lave en public variable som FIL2 kunne læse "direkte". Jeg havde helt glemt den mulighed.

Jeg vil tro jeg har nok RAM, så det må komme an på en prøve :)
Avatar billede arne_v Ekspert
25. marts 2018 - 17:16 #4
Det koster ikke rigtihgt noget at sende over som argument. Det er jo en reference til List<Noget> der bliver sendt over ikke hele objektet, saa 4 eller 8 bytes.
Avatar billede arne_v Ekspert
25. marts 2018 - 17:17 #5
Hvis du er paa Java 8 eller nyere saa husk at streams og lambdas kan lave en masse med en List.
Avatar billede encorez Juniormester
25. marts 2018 - 22:24 #6
Nu når jeg sidder og leger med at få Listen med over som argument (som virker fint) tænker jeg om det giver nogen forskel at istedet lave referencen til sql resultatet. Jeg har test det og det virker også fint. Det vil gøre det en del nemmere i min kode, hvis ikke det giver nogen ressource mæssig forskel.

Ved du om det gør en forskel, jeg tænker performance eller ressource mæssig forskel?

FIL1
query = "";
st = conn.createStatement();
rs = st.executeQuery(query);
String test_kombo_result = kombinere.func2(rs);

FIL2
public static String func2(ResultSet rs){
    while (rs.next()) {
          "behandler resultaterne"
}}
Avatar billede arne_v Ekspert
26. marts 2018 - 01:16 #7
Det virker fint hvis func2 kun kaldes en gang.

Men hvis func2 kaldes mange ganeg kommer du jo til at hente data mange gange.

Fidusen ved at hente til en List og saa sende den over til func2 er at data kan genbruges igen og igen.
Avatar billede encorez Juniormester
26. marts 2018 - 09:24 #8
func2 bliver kaldt mange gange, men der behøver kun at blive hentet data fra sql én gang. Lad mig præcisere FIL1.
Er det så ikke stadig kun referencen til "rs" som sendes med over?
I FIL2 starter jeg så med "rs.beforeFirst();" for at starte datasættet forfra.

FIL1
query = "";
st = conn.createStatement();
rs = st.executeQuery(query);
while("forskellige parametre"){
        String test_kombo_result = kombinere.func2(rs, "forskellige parametre");
}

FIL2
rs.beforeFirst();
while (rs.next()) {
    "data behandling"
}
Avatar billede arne_v Ekspert
26. marts 2018 - 16:34 #9
Det er en meget sjaelden brugt feature.

st = conn.createStatement();

og

st = conn.createStatement(TYPE_FORWARD_ONLY);

vil give dig en exception ved kald af rs.beforeFirst().

st = conn.createStatement(TYPE_SCROLL_SENSITIVE);

vil resultere i at data bliver laest igen fra databasen.

st = conn.createStatement(TYPE_SCROLL_SENSITIVE);

vil enten give dig det du oensker eller resultere i en exception fordi din JDBC driver ikke understoetter det.

Jeg vil betragte at laese ind i en List<Noget> som det mere sikre valg.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester