Проблема, с которой вы сталкиваетесь, связана с тем, что Oracle-сессия может оставаться активной, даже после того, как вы закрыли соединение с базой данных. Это может произойти по нескольким причинам:
Пул соединений: По умолчанию Oracle использует пул соединений, чтобы избежать накладных расходов на открытие и закрытие соединения для каждого запроса. Когда вы вызываете await connection.OpenAsync(), соединение добавляется в пул, а при вызове await connection.Close() оно возвращается обратно в пул вместо фактического закрытия. Это позволяет повторно использовать соединение при следующих запросах, что улучшает производительность, но сессия на сервере остается активной.
Delay Transaction: Если в процессе выполнения вашего кода есть задержки (например, долгие вычисления, ожидание данных и т.д.), транзакция может оставаться открытой и удерживать сессию, пока транзакция не будет завершена или отменена.
Явное использование транзакций: Если вы явно используете транзакции с использованием OracleTransaction, убедитесь, что они завершаются или откатываются после выполнения всех необходимых операций.
Чтобы правильно управлять соединениями и сессиями в ASP.NET Core, рекомендуется использовать инъекцию зависимостей и политику управления соединениями в разделе "ConfigureServices" в классе Startup.
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddDbContext<YourDbContext>(options =>
options.UseOracle(Configuration.GetConnectionString("YourOracleConnection")));
// ...
}
И далее работайте через этот контекст
// UserService.cs
public class UserService
{
private readonly YourDbContext _dbContext;
public UserService(YourDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<List<User>> GetUsers()
{
List<User> users = new List<User>();
try
{
// Выполнение запроса SELECT * FROM users
users = await _dbContext.Users.ToListAsync();
}
catch (Exception e)
{
// Логирование исключения
}
finally
{
// Закрытие сессии БД
_dbContext.Dispose();
}
return users;
}
}