2009-06-30 3 views
4

Ich habe ein Problem mit einer wirklich langsamen Verbindung zwischen meinem Java-Code und einer MySQL-Datenbank. Ich weiß nicht, wo der Flaschenhals ist.JDBC mit MySQL wirklich langsam, weiß nicht, warum

Mein Programm ist mehr oder weniger ein Chatbot. Der Benutzer gibt etwas ein, mein Programm teilt den Satz in Wörter auf und sendet sie wortweise an die Datenbank. Wenn es dort etwas findet, erhält der Benutzer eine Ausgabe. Die Datenbank befindet sich auf einem externen Server, aber ich habe auch versucht, mich mit einem PC zu verbinden. Beides ist langsam.

Ich versuchte die Verbindung einmal an einem anderen Ort, wo ich normalerweise arbeite und dort war es schnell, die meiste Zeit.

My SQL-Code:

SELECT info.INFORMATION VON INFORMATIONEN Info, INFO_SCHLUESSEL sch
WHERE LCASE (sch.SCHLUESSELWORT) LIKE ' "+ Eingang +" %' AND info.ID_INFO = sch.ID_INFO
Bestellung von info.PRIORITAET DESC LIMIT 1;

(nur in Erinnerung, wenn es den SQL-Code zu verstehen, hilft:
schluessel = key
Schluesselwort = Schlüsselwort
prioritaet = Priorität)

Meine Java-Datenbank-Code ist mehr oder weniger Standard-Sachen :

Zeichenfolge driver = "com.mysql.jdbc.Driver";
Zeichenfolge dbase = "jdbc: mysql: // bla";
String dbuser = "bla";
Zeichenfolge dbpw = "bla";

Class.forName (Treiber);
Verbindung con = DriverManager.getConnection (dbase, dbuser, dbpw);
Anweisung stmt = con.createStatement();

Ergebnissatz rs = stmt.executeQuery (query);
während (rs.next())
{
ergebnis = rs.getString ("info.INFORMATION");
}

rs.close();
stmt.close();
con.close();

edit:

ich diesen DBCP jetzt eine Zeit lang versucht haben, und ich kann nicht scheinen, um es zu arbeiten. Es scheint so langsam zu sein wie die alte Verbindung.Dies ist das Beispiel der von mir verwendeten Website:

GenericObjectPool connectionPool = neu GenericObjectPool (null);
ConnectionFactory connectionFactory = neu DriverManagerConnectionFactory ("jdbc: mysql: // bla", "bla", "bla");
PoolableConnectionFactory pooloalConnectionFactory = neue PoolableConnectionFactory (connectionFactory, connectionPool, null, null, false, true);
PoolingDriver-Treiber = new PoolingDriver();
driver.registerPool ("Beispiel", connectionPool);
Verbindung conn = DriverManager.getConnection ("jdbc: apache: commons: dbcp: example");

+0

Verwenden Sie einen Verbindungspool? – Thilo

+0

Nein, noch nicht. Aber ich werde jetzt nachsehen. –

Antwort

6

Ich vermute, dass es das Verbindungs-Setup ist, das das Problem verursacht. Es würde sich lohnen, Timing, wie lange dies dauert:

Connection con = DriverManager.getConnection(dbase, dbuser, dbpw); 

und wenn ja, überprüfen Apache Commons DBCP, die Sie Datenbankverbindungen bündeln können.

+0

Ja, es scheint das Problem zu sein ... Dies allein dauert etwa 2 Sekunden. Ich werde deinen Link lesen. –

+0

Ausgezeichnet (dass Sie das Problem gefunden haben). Der Pool erstellt und verwaltet Verbindungen für Sie und verteilt sie bei Bedarf ohne den Zeitaufwand für die Verbindungszeit. –

+0

Ich habe es versucht, aber ich kann es nicht zur Arbeit bringen. Vielleicht könnten Sie sich den Connection Pool Code ansehen, den ich in meinen ursprünglichen Post bearbeitet habe? –

0

Nun, ich denke, dies rechtfertigt eine Diskussion über das Design. Es gibt ein paar Dinge, die Sie tun können, um die Leistung zu verbessern. Da Sie hier nichts persistieren, ist es besser, alle Daten im Speicher in einem benutzerdefinierten Java-Objekt, einer Map, einer Liste oder Ähnlichem vorab zu laden und dann eine In-Memory-Suche nach dem Wort durchzuführen und die Ergebnisse zu erhalten. Ein anderer Ansatz könnte darin bestehen, eine Batch-Anweisung zu verwenden, sodass Sie keine Verbindungen für jedes Wort erstellen und freigeben können. Ach ja, und wenn Batch-Anweisungen verwendet werden, stellen Sie sicher, dass Sie die Batch-Größe auf eine geeignete Zahl setzen, vorzugsweise eine Primzahl

+1

Alle Daten vorladen? Das mag mit einer kleinen Datenbank möglich sein, aber je größer die Datenbank, desto mehr muss der Benutzer über das Internet laden. Es kann schneller für die Suche sein, aber bis der Computer alle Daten hat, die er braucht, hat es länger gedauert als mein alter Ansatz. –

+0

Nun, im Grunde garantiert das Design eine Anforderung, warum Sie wortbasierte Daten in einer relationalen Datenbank speichern. Wenn Sie es aus Gründen der Persistenz tun, denke ich, dass die Lösung keinen Sinn ergibt. Ein besserer Ansatz wäre es, dateibasiert zu sein und eine IR-Bibliothek für die Indizierung und Suche zu verwenden. – user121803

+0

Vielleicht wäre es eine bessere Annäherung, aber ich war glücklich, irgendwie zu tun, was von mir gefragt wurde. Hätte nie gedacht, dass ein dateibasiertes System auch eine Fähigkeit ist. Vielleicht beim nächsten Mal ... Es ist nur ein Prototyp. Es muss irgendwie funktionieren, es ist keine große Sache, wenn es nicht perfekt ist. –

Verwandte Themen