Я пытаюсь понять, когда создаются и удаляются временные таблицы.
Я думал, что временная таблица удаляется в конце сеанса, но этот тест заставляет меня не уверен в этом.
Строка подключения имеет Pooling=true;Maximum Pool Size=50
, поэтому существует пул, с максимум 50 подключениями.
Я запускаю следующий фрагмент кода одновременно, 30 заданий одновременно. Я вижу, что используются 30 различных значений идентификатора процесса (что позволяет предположить, что в общей сложности 30 соединений открыто и используется повторно) независимо от того, сколько раз я запускаю код. Таким образом, пул, кажется, работает.
using (var connection = new NpgsqlConnection(connectionString))
{
var insertIds = GetInsertIds(1000).ToList();
await connection.OpenAsync();
var transaction = connection.BeginTransaction();
await connection.ExecuteAsync(@"
CREATE TEMP TABLE tmp_data
(
insertid INTEGER NOT NULL
);", transaction: transaction);
const string copyItemSql = @"
COPY tmp_data(
insertid
) FROM STDIN (FORMAT BINARY)
";
using (var writer = connection.BeginBinaryImport(copyItemSql))
{
foreach (var insertId in insertIds)
{
writer.StartRow();
writer.Write(insertId, NpgsqlDbType.Integer);
}
}
await connection.ExecuteAsync(@"
INSERT INTO data (insertid)
SELECT tmpd.insertid
FROM tmp_data tmpd;
", transaction: transaction);
transaction.Commit();
}
Мои предположения, где это:
- Я бы получил исключение, когда соединение берется из пула и используется повторно, поскольку
tmp_data
уже существует. Этого не происходит, код работает просто отлично.
- Я мог бы обойти это, выполнив
CREATE TEMP TABLE IF NOT EXISTS tmp_data ...
. Но тогда у меня возникнет проблема, что, поскольку tmp_data
уже существует, все равно будут строки из предыдущей вставки. И я мог бы обойти это, выполнив ON COMMIT DELETE ROWS
.
Так я не прав? Разве соединение в пуле - это не то же самое, что сеанс? Почему временная таблица не существует во второй раз, когда соединение повторно используется?