Il manque un paramètre AsyncCallback dans la MySQLCommand BeginExecuteReader, ce qui le rend pratiquement inutile

StackOverflow https://stackoverflow.com/questions/1444884

Question

J'espère que quelqu'un ici pourra m'aider.

La société pour laquelle je travaille préfère utiliser MySQL plutôt que MSSQL. J'ai donc téléchargé le dernier pilote (6.1) et porte la couche DB.

Cependant, je ne trouve pas la fonction BeginExecuteReader qui prend un rappel en paramètre.

Est-ce pour une raison? Ou cela fonctionne-t-il différemment avec MySQL?

Autant que je sache, si le code ne déclenche pas de rappel, il serait nécessaire d’interroger ce qui le ralentit. Utiliser un thread bloquant par connexion est également quelque chose que je veux éviter.

Quelqu'un a-t-il une idée pour y remédier? (sauf pour modifier le pilote qui est probablement au-delà de mes pouvoirs)

R

Était-ce utile?

La solution

La version 6.3.4 de MySQL Connector implémente les méthodes async mais il semble qu’elle appelle uniquement un délégué de manière asynchrone. Elle ne bloque donc pas le thread appelant, mais ne sauvegarde aucun thread du ThreadPool. Voici le rapport de bogue à ce sujet .

Et, comme vous l'avez dit, il n'a pas de paramètre de rappel. Voici le rapport de bogue à ce sujet .

Je pense que les fournisseurs de données de devart implémentent correctement les méthodes asynchrones, mais elles ne sont pas gratuites.

Quoi qu’il en soit, les appels de base de données async n’impliquent PAS en soi une meilleure évolutivité globale. Je recommande la lecture de l'article & l; Mes appels de base de données doivent-ils être asynchrones? " pour une analyse approfondie.

Autres conseils

Je ne connais pas spécifiquement ce connecteur, mais tous les autres connecteurs que j'ai vus pour mysql attendent que le serveur renvoie les données lors de l'appel execute () ou query (). le plus proche que vous obtiendrez utilisera le " unbuffered " version, qui retourne immédiatement à partir de execute () ou query (), mais se bloque lorsque vous essayez de demander la ligne suivante mais que celle-ci n'est pas encore arrivée du serveur mysql.

Le support des fils MySQL me semble être une réflexion après coup.

Vous ne pouvez pas, par exemple, via l'API C, annuler une requête émise; au contraire, la fonction de requête bloque simplement. Pour créer plusieurs requêtes simultanées, un seul thread est requis par requête!

Essayez d’utiliser Postgres. Je ne l'ai pas utilisé (l'API C m'a mis mal à l'aise - toutes ces typedefs), mais il prend certainement en charge les requêtes multithreads (par exemple, les appels asynchrones, etc.).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top