» »

java / mysql / počasne poizvedbe

java / mysql / počasne poizvedbe

BRBR ::

1. če poženem katerikoli sql skoz heidisql (al pa katerkol drug client side UI) traja stvar x časa
2. skozi javo pa y in x:Y = ugotovljeno tudi 1:10

Zakomentirano so poskusi, da bi kaj spremenil, pa ni pomagalo

test:

 long sql_execution_time = 0;
          String url = "jdbc:mysql://my.net:3306/test";

          Class.forName("com.mysql.jdbc.Driver").newInstance();

          Properties props = new Properties();
          props.setProperty("user", "user");
          props.setProperty("password", "pwd");
          //props.setProperty("autoReconnect", "true");

          props.setProperty("characterEncoding", "UTF-8");
          //props.setProperty("useReadAheadInput", "true");
          //props.setProperty("SelectMethod", "direct");
          //props.setProperty("responseBuffering", "adaptive");
    


          Connection con = DriverManager.getConnection(url,props);
          String sql = "sql statement";

          //java.sql.Statement stm = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
          java.sql.Statement stm = con.createStatement();

          long startTime = System.currentTimeMillis();

          ResultSet rs = stm.executeQuery(sql);

          long endTime = System.currentTimeMillis();
          sql_execution_time = endTime - startTime;
          long krneki = sql_execution_time;
          startTime = endTime;
          stm.close();
          con.close();
          result = String.valueOf(sql_execution_time);

jan_g ::

Vsakič naložiš celoten sql stack, ker za merjenje poženeš enkrat v enem JVM-ju, drži? Poskusi svojo logiko pognati večkrat zaporedoma, pri čemer ponovno uporabiš že vzpostavljeno konekcijo do baze.

Poleg tega je pametno uporabiti tudi PreparedStatement iz več razlogov, eden je tudi zaradi hitrosti, ampak bom ponovno poudaril, da se to pozna šele pri večkratnem izvrševanju sql-a.

BRBR ::

ok če dam test v loop
          for (int i = 0; i < 10; i++)
          {
            long startTime = System.currentTimeMillis();

            ResultSet rs = stm.executeQuery(sql);

            long endTime = System.currentTimeMillis();
            sql_execution_time = endTime - startTime;
            al.add(sql_execution_time);
          }
          result = al.toString();


so timingi v milisec:
stp [122, 85, 82, 53, 54, 54, 52, 54, 55, 53]
prepstm[118, 82, 81, 54, 51, 55, 54, 55, 54, 53]

torej ni razlike mes stmt in prepstm, glede hitrosti (morda ker nimam nič parametrov pri prepstm)

heidi sql mi pokaže 45ms, OK ampak tole je zadost blizu, in kajpak mnogo bolje.

Torej načeloma na bi to delalo takole, če imam connection pooling:
1.odprem en web page: 120ms
2.ga odprem ponovno, in če pool izbere drug connection (al pa ga bognedaj čisto na novo odpre connection) je spet 120 ms
3.ga odprem ponovno in pool izbere isti conection kot prej: < 120 ms

?

Če zdajle klikam refresh , je skoz isto 120 ms. Al to pomeni, da mi connection pooling ne dela ?

Zgodovina sprememb…

  • spremenil: BRBR ()

jan_g ::

Težko konkretno kaj rečem, ker v bistvu ne vem, kako deluje tvoj program. Refresh česa? A si si naredil gui ali je to v terminalu? Drugače pa ja, connection (oz. na splošno resource) pooling je vedno koristna stvar. Apache ima eno knjižnico,ki jo lahko izkoristiš: dbcp

Seveda je v končni fazi nekaj odvisno tudi od implementacije knjižnice za dostopanje do baze. Se mi zdi, da je že bilo nekaj kritik na račun Connector/J (mysql client knjižnica za javo), češ da so se za druge jezike (C, Perl, itd.) dosti bolj potrudili.

BRBR ::

U glavnem, naredil sem si en svoj connection pool. Tako da 100% vedno uporabim isti connection (kateremu nikoli ne rečem .close) , torej se odpre samo enkrat.

Vseeno dobim vsakič ko poženem zgornji loop tole:

[122, 85, 82, 53, 54, 54, 52, 54, 55, 53]


?

Zgodovina sprememb…

  • spremenil: BRBR ()

BRBR ::

Zaenkrat je začelo obratovat tako ko naj bi, če prvič odprem web stran je recimo 1000ms, na refresh pa samo 4ms.

Restartal sem mysql server, cnf ni spremenjen nič

sem pa tik pred zdajci odpr en connection na bazo s telimi parametri:

//https://confluence.sakaiproject.org/dis...
props.setProperty("useServerPrepStmts", "false");
props.setProperty("cachePrepStmts", "true");
props.setProperty("prepStmtCacheSize", "4096");
props.setProperty("prepStmtCacheSqlLimit", "4096");

kar naj bi šele usposobilo query caching my MySQL

Ampak na servrju koda ni spremnjena in teh parametrov tam ni.

Tako da ne vem zakaj zdaj obratuje.

Zgodovina sprememb…

  • spremenil: BRBR ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

java date/time

Oddelek: Programiranje
111383 (1066) Slovenet
»

[Java] Prevajanje in šumniki v ubuntu

Oddelek: Programiranje
202305 (1922) mmaestro
»

[Java] Zasnova shoot em up igre

Oddelek: Programiranje
111104 (783) PecenkA
»

[Java] Evidenca delovnega časa - Java v navezi z Accessom

Oddelek: Programiranje
393183 (2403) c0dehunter
»

grafika problem [JAVA]

Oddelek: Programiranje
61095 (978) Bojevnik

Več podobnih tem