在使用剃刀页时,处理数据库连接和从表中获取数据的“正确”方法是什么?
此设置工作正常,但当站点上有很多用户时会发生什么情况?是否会出现sql连接错误?我已将AddTransient添加到管理器和sql类中,根据我的理解,AddTransient
会在每次需要时创建该对象的新示例,然后再次销毁它
那么,有没有更好的方法来处理sql连接和使用razor pages进行数据处理呢?
目前我有这样的设置:
SQL数据访问
private readonly IConfiguration _config;
MySqlConnection conn;
MySqlCommand cmd;
MySqlDataReader reader;
public string ConnString { get; private set; }
public SqlDataAccess(IConfiguration config)
{
_config = config;
ConnString = _config.GetConnectionString("Default");
}
public List<Product> GetProducts()
{
try
{
List<Product> products = new List<Product>();
conn = new MySqlConnection(ConnString);
conn.Open();
cmd = new MySqlCommand("query", conn);
reader = cmd.ExecuteReader();
while (reader.Read())
{
products.Add(new Product((string)reader["PartNumber"], (string)reader["Name"], (int)reader["Stock"], (decimal)reader["Price"]));
}
conn.Close();
return products;
}
catch (Exception)
{
throw new Exception();
}
}
产品经理
private readonly ISqlDataAccess _db;
public ProductManager(ISqlDataAccess db)
{
_db = db;
}
public List<Product> GetProducts()
{
return _db.GetProducts();
}
Program.cs
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddTransient<ISqlDataAccess, SqlDataAccess>();
builder.Services.AddTransient<IProductManager, ProductManager>();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
}
1条答案
按热度按时间mhd8tkvw1#
每次都关闭连接,这样就不会发生内存泄漏。事实上,连接会返回到连接池中供重用,以保存每次从新示例化连接的成本。因此,从性能的Angular 来看,您的方法没有问题。
至于管理数据访问的“更好”的方法,这是一个见仁见智的问题(我个人建议使用ORM),并且很可能会解决您的问题;- )