3.3 Синхронное и асинхронное выполнение
Традиционно многие драйверы MySQL использовали синхронный подход при выполнении SQL-запросов. Это означало, что такие операции, как открытие соединений и выполнение запросов, блокировались до завершения, что могло занимать много времени. Для обеспечения параллельного выполнения разработчику приходилось писать многопоточное приложение.
Любой MySQL-клиент, поддерживающий протокол X, может обеспечивать асинхронное выполнение, используя колбэки, Promises или явно ожидая конкретного результата в момент, когда он действительно нужен.
Асинхронные операции
Использование колбэков является очень распространенным способом реализации асинхронных операций. При указании функции обратного вызова (callback) операция CRUD не блокирует выполнение, что означает, что следующий оператор вызывается немедленно, даже если результат из базы данных еще не получен. Только когда результат становится доступным, вызывается колбэк.
Код JavaScript Node.js
var employees = db.getTable('employee');
employees.select('name', 'age')
.where('name like :name')
.orderBy('name')
.bind('name', 'm%')
.execute(function (row) {
// do something with a row
})
.catch(err) {
// Handle error
});
Код C#
var employees = db.GetTable("employee");
var select = employees.Select("name", "age")
.Where("name like :name")
.OrderBy("name")
.Bind("name", "m%")
.ExecuteAsync();
select.ContinueWith(t =>
{
if (t.Exception != null)
{
// Handle error
}
// Do something with the resultset
});
Код Java
Table employees = db.getTable("employee");
// execute the query asynchronously, obtain a future
CompletableFuture<RowResult> rowsFuture = employees.select("name", "age")
.where("name like :name")
.orderBy("name")
.bind("name", "m%").executeAsync();
// dependent functions can be attached to the CompletableFuture
Код JavaScript MySQL Shell
// Asynchronous execution is not implemented
Код Python MySQL Shell
// Asynchronous execution is not implemented
Код Python
// Asynchronous execution is not implemented
Код C++
// Asynchronous execution is not implemented
Асинхронные операции с использованием await
Некоторые языки могут использовать паттерн async/await.
Код C#
Task<RowResult> getEmployeesTask = employees.Select("name", "age")
.Where("name like :name").OrderBy("name")
.Bind("name", "m%").ExecuteAsync();
// Do something else while the getEmployeesTask is executing in the background
// at this point we are ready to get our results back. If it is not done,
// this will block until done
RowResult res = await getEmployeesTask;
foreach (var row in res.FetchAll())
{
// use row object
}
Connector/Node.js использует асинхронные операции с использованием Promises для всех сетевых операций. См. другие примеры.
Код Java
Table employees = db.getTable("employee");
// execute the query asynchronously, obtain a future
CompletableFuture<RowResult> rowsFuture = employees.select("name", "age")
.where("name like :name")
.orderBy("name")
.bind("name", "m%").executeAsync();
// wait until it's ready
RowResult rows = rowsFuture.get();
Различия в синтаксисе
В зависимости от используемого языка, X DevAPI может реализовывать функцию, такую как executeAsync() в обмен на execute([mysqlx.Async]) или дополнительно к execute([mysqlx.Async]).
Например, в контексте Node.js все выполнения являются асинхронными. Поэтому Connector/Node.js не нуждается в различении между execute() и executeAsync(). Для обозначения асинхронного по умолчанию выполнения Connector/Node.js реализует только execute(), возвращающее объекты JavaScript Promise.
Языки программирования со строгим типом, такие как Java или C#, могут воспользоваться наличием двух API-вызовов с различными именами для синхронного и асинхронного выполнения. Два вызова могут иметь разные типы возвращаемых значений. Например, Connector/J может использовать execute() для возвращения RowResult или DocResult и executeAsync() для возвращения CompletableFuture<T>, где параметр типа является одним из типов результатов.
© 2025 Oracle
Licensed under the GPLv2 License.