[JAVA/JDBC] Traag bij opzetten verbinding met MySQL *

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Hallo,

ik ben een beginner in java, en heb zojuist voor de eerste keer een database-verbinding gemaakt. De code werkt prima, echter levert het wel een probleem op: het verbinden met de (locale) database duurt heel lang, soms wel tot 5 seconden. Dezelfde database reageert in PHP wel snel. Queries worden wel gewoon snel uitgevoerd, maar over conn = DriverManager.getConnection(url+dbName,userName,password); doetie nogal lang. Hieronder de rest van de code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 System.out.println("MySQL Connect Example.");
    Connection conn = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "beer";
    String driver = "com.mysql.jdbc.Driver";
    String userName = "root"; 
    String password = "";
    try {
        Class.forName(driver).newInstance(); 
      conn = DriverManager.getConnection(url+dbName,userName,password);

      Statement stmt = conn.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * FROM users u");
          System.out.println("Display all results:");
          while(rs.next()){
            String str1= rs.getString("id");
            String str = rs.getString("name");
            System.out.println("Id= " + str1
                                 + "\tName = " + str);
          }//end while loop
      conn.close();
      System.out.println("Disconnected from database");
    } catch (Exception e) {
      e.printStackTrace();
    }


Ik heb uiteraard op google al gezocht naar 'slow jdbc java connect' en dergelijke varianten, maar echt iets zinvols vinden doe ik niet. Waar zit hier het probleem? De driver, de code of wat anders?

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Afgezien van het feit dat de code niet robuust genoeg is t.a.v. het lekken van resources, zie ik geen fouten in de code. Dan ligt het dus aan de driver, het netwerk (firewall!) en/of de database.

Welke driver versie gebruik je? Welke DB versie gebruik je? Probeer eens de laatste versies (driver versie moet wel matchen met de DB versie). Staat er een firewall aan? Probeer deze eens te uitschakelen.

Java met PHP vergelijken is appels met peren vergelijken. PHP gebruikt "vooraf in C++ geschreven code" in vorm van functies om met MySQL te connecten en deze is natuurlijk al uitgeoptimaliseerd. Met rauwe Java schrijf je die code zelf. Wanneer jouw applicatie zover komt dat het veel moet connecten in een multi-user omgeving, zou je eens connection pooling kunnen overwegen, deze kan dan de connectie "cachen" binnen bepaalde grenzen voor hergebruik.

[ Voor 39% gewijzigd door BalusC op 19-06-2009 22:16 ]


Acties:
  • 0 Henk 'm!

  • Tubby
  • Registratie: Juni 2001
  • Laatst online: 23:42

Tubby

or not to be

Bovendien gebruik je in de praktijk een connection pooling package zoals c3p0 om je connections te managen. Zo'n package houdt zelf een minimum aantal connections open zodat je niet zo heel vaak hoeft te wachten op het daadwerkelijk openen van een connection.

tubby.nl - Artes Moriendi - q1 - bf1942 - WoT - pubg - LinkedIN


Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
marqram schreef op vrijdag 19 juni 2009 @ 21:22:
Hallo,

ik ben een beginner in java, en heb zojuist voor de eerste keer een database-verbinding gemaakt. De code werkt prima, echter levert het wel een probleem op: het verbinden met de (locale) database duurt heel lang, soms wel tot 5 seconden. Dezelfde database reageert in PHP wel snel. Queries worden wel gewoon snel uitgevoerd, maar over conn = DriverManager.getConnection(url+dbName,userName,password); doetie nogal lang. Hieronder de rest van de code:

[..]

Ik heb uiteraard op google al gezocht naar 'slow jdbc java connect' en dergelijke varianten, maar echt iets zinvols vinden doe ik niet. Waar zit hier het probleem? De driver, de code of wat anders?
Welke Java versie en welke Windows (of ander OS)? Gaat het wel snel als je direct een IP-adres gebruikt? Er zijn een aantal combinaties van Java, OS en verkeerde DNS waarbij het openen van een Socket (wat binnen de JDBC driver wordt gedaan) er traag kan gaan. Ik dacht dat dat overigens iig in Java 6 Update 14 (misschien al eerder) verholpen of iig verbeterd was.

Acties:
  • 0 Henk 'm!

Verwijderd

Omdat je over PHP spreekt neem ik aan dat je Java wilt gebruiken voor een webapplicatie ? In dat geval kan je de JDBC connecties beter door de container laten managen. Zie bivjoorbeeld http://thestewscope.wordp...nd-mysql-connection-pool/

Zelf gebruik ik vaak een ORM (datanucleus bijvoorbeeld) waarbij pooling zelfs buiten een Java EE container een kwestie van configureren is (http://www.datanucleus.or...s/connection_pooling.html)

Edit: Overigens wil ik er nog even bij zeggen dat de vertraging die je aangeeft (5 sec) absurd is en niet kan komen door een gebrek aan pooling (lijkt mij). Zal waarschijnlijk wel iets met DNS zijn.

[ Voor 17% gewijzigd door Verwijderd op 20-06-2009 01:38 ]


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Hieronder wat versienummers:
mysql 5.0.51b
java 6.14
mysql-connector 5.1.7
windows xp(sp2, denk ik)

De vergelijking met PHP komt omdat dat de enige andere taal is waarmee ik bekend ben, Java is in dit geval niet specifiek voor een webapplicatie.

Bedankt voor de tip over connection pooling, hier had ik nog niet van gehoord. Ik zal het eens gaan bekijken.

Wat het probleem betreft: kunnen netwerk/dns/firewall problemen veroorzaken bij een localhost? De DB draait dus op dezelfde pc als het programma wat de connectie maakt.

Acties:
  • 0 Henk 'm!

  • momania
  • Registratie: Mei 2000
  • Laatst online: 17-09 07:50

momania

iPhone 30! Bam!

Hoe run je je programma en wat beschouw je als die 5 seconden? Run je het niet vanuit een IDE bijvoorbeeld en zit daar nog wat tijd aan compile tijd bij?

Neem je whisky mee, is het te weinig... *zucht*


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Ja, ik run het programma vanuit de IDE(eclipse). Als ik regel 10 tussen 2 print-statements zet, zit tussen de twee prints 5 tellen.

Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
marqram schreef op zaterdag 20 juni 2009 @ 10:19:
Ja, ik run het programma vanuit de IDE(eclipse). Als ik regel 10 tussen 2 print-statements zet, zit tussen de twee prints 5 tellen.
Om de tijd nauwkeuriger te meten zou je het volgende kunnen doen:
Java:
1
2
3
4
5
6
    long begin = 0;
    long eind = 0;
    begin = System.currentTimeMillis();
    // code ...
    eind = System.currentTimeMillis();
    long tijd = eind - begin;

Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
De methode om de tijd te meten zoals hierboven geeft 5.20 seconden voor
code:
1
    conn = DriverManager.getConnection(url+dbName,userName,password);

vandaag maar weer gezocht naar een reden, maar ik vind niets. Wat voor instellingen zouden dit kunnen verhelpen?

Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
Hmm, dat is wel erg lang. Ik heb jouw code op mijn machine uitgevoerd en het maken van een connectie (DriverManager.getConnection(...)) duurt slechts 211ms. Ik gebruik mysql-connector-java-5.1.7-bin.jar en MySQL 5.1.35, java 6 update 13 op windows 7.

Acties:
  • 0 Henk 'm!

  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

marqram schreef op zaterdag 20 juni 2009 @ 15:23:
vandaag maar weer gezocht naar een reden, maar ik vind niets.
Wat heb je allemaal gezocht/geprobeerd? Ik lees helaas nergens terug of je überhaupt de eerder genoemde suggesties/tips zoals versie upgrade, DNS checken, IP adres gebruiken, firewall uitzetten, etcetera hebt uitgeprobeerd.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
marqram schreef op zaterdag 20 juni 2009 @ 15:23:
De methode om de tijd te meten zoals hierboven geeft 5.20 seconden voor
code:
1
    conn = DriverManager.getConnection(url+dbName,userName,password);

vandaag maar weer gezocht naar een reden, maar ik vind niets. Wat voor instellingen zouden dit kunnen verhelpen?
Wat gebeurt er als je de hostnaam en IP-adres van je PC toevoegt aan de hosts file? (in %WINDIR%\system32\drivers\etc ). Ik meen me vaag iets te herinneren dat Java in sommige situaties de host (en niet localhost, maar de externe netwerk interface) probeert te resolven (over reverse-resolven) en als deze niet in de DNS of hosts is opgenomen, dat enige tijd kan duren (timeouts ed).

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Als hij localhost niet naar 127.0.0.1 kan resolven, dan kan je zomaar tegen een timeout aanlopen ja. Om dat uit te sluiten zal hij toch echt moeten proberen om 'localhost' in die url door '127.0.0.1' te vervangen. [/voorkauwen]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Ik heb inmiddels wat dingen geprobeerd als het door jullie voorgestelde vervangen van localhost door het ip, dit heeft geen effect: de verbinding komt wel tot stand, maar pas na 5 tellen.

Het plaatsen van mijn ip in de hosts-file heeft geen effect, tijd blijft ca. 5 seconden. Firewall uitzetten had ook geen effect.

Acties:
  • 0 Henk 'm!

  • Cobalt
  • Registratie: Januari 2004
  • Laatst online: 28-08 14:11
Is het mogelijk om de database te updaten naar MySQL 5.0.83 of 5.1.35? Wellicht dat het probleem dan opgelost is.

Acties:
  • 0 Henk 'm!

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 17-09 15:11
Is het inmiddels opgelost? Ik loop tegen (ongeveer) hetzelfde probleem aan. Op de localhost draait het wel goed, maar over LAN gaat het maken van de verbinding over de 5000 ms heen. Het uitvoeren van de query duurt wel maar 31 ms.

Het lijkt mij zeker een netwerkprobleem omdat het wisselen tussen servers en clients geen positief effect heeft.

Ik zal zometeen nog proberen met een crosslink kabel een client direct op een server aan te sluiten zodat ik het probleem bij de modem/router kan uitsluiten.

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Gebruik je de hostname of het IP van de server in de JDBC url? Indien het eerste: heb je hetzelfde probleem als je het laatste probeert?

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • Teeno
  • Registratie: Juni 2007
  • Laatst online: 17-09 15:11
Ik gebruik het IP adres.

Het vreemde is dat het wel meer dan een jaar goed gedraaid heeft, er zijn 6 clients die het gebruiken, en *opeens* is het zo langzaam geworden dat er eigenlijk niet meer mee te werken valt. Ik kan me niet herinneren dat er recent updates voor de firewall of netwerkapparatuur zijn geinstalleerd.

Toevoeging:
Een aantal weken geleden was het alleen langzaam bij clients die een laag IP kregen van de DHCP, dit waren de Windows XP machines. Een aantal clients met Vista kregen een hoger IP van de DHCP en hierop is het langer snel blijven werken. Een punt wat ikzelf niet kan verklaren maar misschien wel het vermelden waard.

Toevoeging op toevoeging:
Het handmatig verhogen van het IP adres op de XP machines had tot gevolg dat het weer goed ging werken.

[ Voor 42% gewijzigd door Teeno op 02-11-2009 12:56 ]


Acties:
  • 0 Henk 'm!

  • marqram
  • Registratie: Januari 2008
  • Laatst online: 12-08 23:57
Ik heb dit probleem nooit op kunnen lossen, ben er na heel wat uurtjes proberen en zoeken niet achter gekomen waar de fout zat. Kan de hoogte van een ip-adres ook op localhost voor problemen zorgen? Ik heb toen alle programma's geupdate naar de nieuwste versie, dns gecheckt, firewall uitgeschakelt, ip in de hosts-file geplaatst. Er was echter niets wat ook maar enigsinds leek te helpen.

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Zitten die adressen in verschillende netwerksegmenten en zijn daar misschien andere routings voor? Het klinkt mij als een netwerk issue in de oren.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • _JGC_
  • Registratie: Juli 2000
  • Laatst online: 07:29
Neem het IP van de client ook even op in de hosts file van de server. Standaard doet mysql reverse lookup zodat je hostnames kunt gebruiken in de grant tables. Ik zet zelf altijd skip-name-resolve in mijn config, maar als je grant tables vol staan met hostnames wil je liever de client in je hosts file zetten.
Pagina: 1