5 votes

JDBC avec MySQL vraiment lent, je ne sais pas pourquoi

J'ai un problème de connexion très lente entre mon code Java et une base de données MySQL. Je ne sais pas où se trouve le goulot d'étranglement.

Mon programme est plus ou moins un chatbot. L'utilisateur tape quelque chose, mon programme divise la phrase en mots et l'envoie mot par mot à la base de données. S'il y trouve quelque chose, l'utilisateur obtient un résultat. La base de données est sur un serveur externe, mais j'ai aussi essayé de me connecter à un ordinateur à côté de moi. Les deux sont lents.

J'ai essayé la connexion une fois dans un autre endroit que celui où je travaille normalement et là, elle était rapide, la plupart du temps.

Mon code SQL :

SELECT info.INFORMATION FROM INFORMATION info, INFO_SCHLUESSEL sch
WHERE LCASE(sch.SCHLUESSELWORT) LIKE ' "" + input + "%' AND info.ID_INFO = sch.ID_INFO
Order BY info.PRIORITAET DESC LIMIT 1 ;

(je viens de me souvenir, si cela peut aider à comprendre le code SQL :
schluessel = clé
Schluesselwort = mot clé
prioritaet = priorité)

Mon code de base de données Java est plus ou moins standard :

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

Class.forName(driver) ;
Connexion con = DriverManager.getConnection(dbase, dbuser, dbpw) ;
Statement stmt = con.createStatement() ;

ResultSet rs = stmt.executeQuery(query) ;
while (rs.next())
{
ergebnis = rs.getString("info.INFORMATION") ;
}

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

éditer :

J'ai essayé ce DBCP depuis un moment maintenant, et je n'arrive pas à le faire fonctionner. Il semble être aussi lent que l'ancienne connexion. Voici l'exemple fourni par le site Web que j'utilise :

GenericObjectPool connectionPool = new GenericObjectPool(null) ;
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://bla", "bla", "bla") ;
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true) ;
PoolingDriver driver = new PoolingDriver() ;
driver.registerPool("exemple",connectionPool) ;
Connexion conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:example") ;

7voto

Brian Agnew Points 143181

Je soupçonne que c'est la configuration de la connexion qui cause le problème. Cela vaudrait la peine de chronométrer le temps que cela prend :

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

et si oui, consultez Apache Commons DBCP qui vous permet de regrouper les connexions aux bases de données.

0voto

user121803 Points 157

Je pense que cela justifie une discussion sur la conception. Il y a quelques choses que vous pouvez faire afin d'améliorer les performances. Puisque vous ne persistez rien ici, il est préférable de précharger toutes les données en mémoire dans un objet Java personnalisé, une carte, une liste ou autre, puis de faire une recherche en mémoire pour le mot et d'obtenir les résultats. Une autre approche pourrait être d'utiliser une instruction batch afin de ne pas créer et libérer des connexions pour chaque mot. Oh, et si vous utilisez des instructions par lot, assurez-vous de définir la taille du lot à un nombre approprié, de préférence un nombre premier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X