在Microsoft.EntityFrameworkCore.Infrastructure
DatabaseFacade.CanConnect()
中,我遇到了一些奇怪的行为,即使当用户帐户被锁定时,这也会返回true,条件是该帐户在应用程序生存期内已经登录过一次。
以下是我所遵循的步骤和我所遇到的情况:
application
canConnect()
连接到DB,这将返回true,页面显示有一些查询结果H 213H 114
用户刷新页面并输入其DB登录H 215H 116
我检查用户详细信息可以使用d17连接到DB,这将返回true,页面显示有一些查询结果--尽管用户帐户是locked
I重新启动web应用程序(应用程序池重置/停止启动),
用户刷新网页并进入其DB登录
I检查用户详细信息可以使用canConnect()连接到DB,这会引发一个异常,因为用户帐户被锁定了
。
为什么如果我锁定帐户,用户可以继续连接到数据库,直到应用程序停止/启动/回收?我不会在C#中使用任何缓存。
我使用的是EFCore 2.2.6和Oracle.ManagedDataAccess.Core 2.19.31
Db服务的作用域为http请求:
services.AddScoped<IOracleAuthenticationModule, OracleAuthenticationModule>();
OracleAuthenticationModule:
public struct UserConnection
{
public string User { get; set; }
public string Password { get; set; }
public string DataSource { get; set; }
}
public OracleDbContext InitialiseUserDb(UserConnection connection)
{
return InitialiseDb($"Data Source={connection.DataSource};User Id={connection.User};Password={connection.Password};Persist Security Info=True;");
}
private OracleDbContext InitialiseDb(string connectionString)
{
DbContextOptionsBuilder<OracleDbContext> optionsBuilder = new DbContextOptionsBuilder<OracleDbContext>();
optionsBuilder.UseOracle(connectionString);
OracleDbContext db = new OracleDbContext(optionsBuilder.Options);
if (db.Database.CanConnect())
{
return db;
}
throw new Exception("Unable to connect to Oracle database, please verify credentials");
}
发布于 2020-07-02 12:54:44
请记住,如果池正在执行ALTER xxx帐户锁,要锁定池本身使用的db帐户,则此命令不影响已在池中打开的连接。
当您锁定Oracle中的用户帐户时,如果用户注销并再次登录,您的池可能不会打开一个新连接,而是重用在锁发生之前已经可用的现有连接。池通常配置为重用现有连接,以避免以连接/断开的形式进行昂贵的操作。
这就是我认为锁在池再次尝试打开一个新连接之前不会影响的,这种情况在停止/启动时发生。
试着看一下
https://docs.oracle.com/database/121/ODPNT/featConnecting.htm#ODPNT170
如果您可以选择检查数据库中的v$session,那么在启动应用程序并运行对数据库的第一个请求时,您将看到池打开了多少个连接。
遵循Oracle文档
打开新连接时,如果连接字符串与现有池不完全匹配,则创建一个新池。在ODP.NET 12.1.0.2之前,只有连接字符串属性值必须匹配。现在,连接字符串本身必须是完全匹配的。为同一连接以不同顺序提供的关键字将单独池。如果已存在具有请求签名的池,则将从该池向应用程序返回连接。创建连接池时,连接池服务最初创建由ConnectionString属性的Min属性定义的连接数。连接池的连接池服务总是维护此数目的连接。在任何给定的时间,这些连接都由应用程序使用,或者在池中可用。
https://stackoverflow.com/questions/62696406
复制相似问题