-
Notifications
You must be signed in to change notification settings - Fork 41
Description
I tried using QueryMode.extended with named parameters instead of QueryMode.simple but when changing my code, I run into parallelization issues somewhere along the parse/bind/execute steps in Postgres.
In my code, I have implemented something like this:
Future executeQuery(String query, {Map<String, String>? parameters) async {
# 1. get new connection from the pool
var dbConn = await getConnection();
# 2. execute the query
if (parameters == null) {
return dbConn.connection.execute(query);
} else {
return dbConn.connection.execute(Sql.named(query), parameters: parameters);
}
}
I make sure that for each call of executeQuery, a new connection is assigned from a Connection Pool. However, if I run parallel queries with different parameter settings
result.addAll([
executeQuery(query1, parameters1), # parameterized query
executeQuery(query2), # no parameters
]);
, I run into errors like:
- "08P01: bind message supplies 1 parameters, but prepared statement "s/0" requires 0"
- "42P05: prepared statement "s/1" already exist"
- "42P05: prepared statement "s/2" does not exist"
...
I am guessing that the parse, bind and execute steps of the parallel queries are mixed up internally somehow. Is this a known behavior? To me this would make sense if using the same connection, but I explicitly make sure that when running parallel queries, each query is assigned a unique connection.
I appreciate any help or insights into this issue!