新聞中心
如何實現(xiàn)ABP框架中的數(shù)據(jù)庫連接?

創(chuàng)新互聯(lián)專注于網(wǎng)站設(shè)計制作、網(wǎng)站制作、網(wǎng)頁設(shè)計、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點出發(fā),讓客戶在網(wǎng)絡(luò)營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對待客戶,用專業(yè)的服務(wù)創(chuàng)造價值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
ABP框架(ASP.NET Boilerplate)是一款基于ASP.NET Core和Entity Framework Core的開源Web應(yīng)用程序框架,它提供了一套通用的基礎(chǔ)設(shè)施,用于開發(fā)跨平臺和可擴展的Web應(yīng)用程序。在ABP框架中,數(shù)據(jù)庫連接是必不可少的一部分,下面將介紹如何實現(xiàn)ABP框架中的數(shù)據(jù)庫連接。
之一步:配置數(shù)據(jù)庫連接字符串
在ABP框架中,數(shù)據(jù)庫連接字符串是存儲在appsettings.json配置文件中的,所以首先需要在這個文件中配置數(shù)據(jù)庫連接字符串??梢园凑找韵率纠a進行配置:
“`
{
“ConnectionStrings”: {
“Default”: “Server=(localdb)\\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;MultipleActiveResultSets=true”
},
“App”: {
“SelfUrl”: “http://localhost:6228”,
“CorsOrigins”: “http://localhost:4200”
}
}
“`
在這個示例代碼中,ConnectionStrings節(jié)點下的Default屬性存儲了連接到本地數(shù)據(jù)庫MyDatabase的連接字符串。根據(jù)實際情況,可以將服務(wù)器名稱、數(shù)據(jù)庫名稱等修改為合適的值。
第二步:添加數(shù)據(jù)庫提供程序
在ABP框架中,需要添加數(shù)據(jù)庫提供程序,以便支持連接不同類型的數(shù)據(jù)庫??梢允褂肗uGet安裝Entity Framework Core的數(shù)據(jù)庫提供程序,例如SqlServer、PostgreSQL、MySQL等。以下是使用SqlServer提供程序的示例代碼:
“`
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext(options =>
options.UseSqlServer(Configuration.GetConnectionString(“Default”)));
}
“`
在這個示例代碼中,調(diào)用了AddDbContext方法向DI容器中注冊了MyDbContext上下文,并使用UseSqlServer方法指定使用SqlServer提供程序連接MyDatabase數(shù)據(jù)庫。根據(jù)實際情況,可以將MyDbContext替換為自己定義的DbContext子類,以及調(diào)用不同的UseXXX方法指定不同的數(shù)據(jù)庫提供程序。
第三步:使用數(shù)據(jù)庫上下文
在ABP框架中,可以使用注入的數(shù)據(jù)庫上下文來訪問數(shù)據(jù)庫??梢栽谛枰褂脭?shù)據(jù)庫的地方,例如ApplicationService和Repository中,通過構(gòu)造函數(shù)注入數(shù)據(jù)庫上下文,例如:
“`
public class MyApplicationService : ApplicationService
{
private readonly MyDbContext _dbContext;
public MyApplicationService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task GetMyEntityAsync(int id)
{
return awt _dbContext.MyEntities.FindAsync(id);
}
}
public class MyRepository : EfCoreRepositoryBase, IMyRepository
{
public MyRepository(IDbContextProvider dbContextProvider)
: base(dbContextProvider)
{
}
}
“`
在這個示例代碼中,MyApplicationService和MyRepository都依賴于MyDbContext,通過構(gòu)造函數(shù)注入了MyDbContext實例,并使用它來訪問數(shù)據(jù)庫。注意,在Repository中使用的是EfCoreRepositoryBase基類,它提供了一些內(nèi)置的常用的數(shù)據(jù)庫訪問方法,例如GetAsync、InsertAsync等。
小結(jié):
相關(guān)問題拓展閱讀:
- C#如何用ajax把本地數(shù)據(jù)庫的數(shù)據(jù)顯示在前端頁面(view里面)?例如一個span一個div
- 100ms的SQL把服務(wù)器搞崩潰了
- abp換能器的位置放在哪里
C#如何用ajax把本地數(shù)據(jù)庫的數(shù)據(jù)顯示在前端頁面(view里面)?例如一個span一個div
首先寫一個一般處理程序來獲取到你要加載到前臺的數(shù)據(jù),并序列化成json格式。
//代碼實例
public class AjaxUserList : IHttpHandler {
public void ProcessRequest(HttpContext context) {
context.Response.ContentType = “text/plain”;
BLL.UserInfoBll userInfoBll = new BLL.UserInfoBll();
int pageIndex;
if (!int.TryParse(context.Request,out pageIndex)) {
pageIndex = 1;
}
int pageSize = 5;
int pageCount = userInfoBll.GetPageCount(pageSize);
//判斷當(dāng)前頁碼的取值范圍
pageIndex = pageIndex pageCount ? pageCount : pageIndex;
隱圓 //獲取分頁數(shù)據(jù)
List userList = userInfoBll.GetPageList(pageIndex, pageSize);
//獲取頁碼條
string pageBar = Util.PageBar.GetPageBar(pageIndex, pageCount);
//***********************************************************
//使用匿名類將多組數(shù)據(jù)序列化成Json格式
//***********************************************************
JavaScriptSerializer js = new JavaScriptSerializer();
string json = js.Serialize(new { resultUserList = userList, resultPageBar = pageBar });//此處使用了匿名類將userList和pageBar進行封裝后,再序列化
//***********************************************************
context.Response.Write(json);
}
public bool IsReusable {
get {
return false;
}
}
}
然后,前臺ajax請求這個一般處理處理程序獲取到j(luò)son數(shù)據(jù),再通過js將數(shù)余褲據(jù)添加到html。
//加載用戶列表示例
function LoadUserInfo(pageIndex) {
$.post(“AjaxUserList.ashx”, { “pageIndex”: pageIndex }, function (data) {
var serverData = $.parseON(data);
for (var i = 0; i ” + serverData.resultUserList.ID + “” + serverData.resultUserList.UName + “” + serverData.resultUserList.UPwd + “” + ChangeDateFormat(serverData.resultUserList.SubTime) + “” + serverData.resultUserList.Remark + “豎攜簡詳細(xì)編輯 刪除”).appendTo(“#tabUserList”);
}
});
100ms的SQL把服務(wù)器搞崩潰了
一個項目上線了兩個月,除了一些反饋的優(yōu)化和小Bug之外,項目一切順利;前期是屬于推廣階段,可能使用人員沒那么多,當(dāng)然對于項目部署肯定提前想到并發(fā)量了,所以早就把集群安排上,而且還在測試環(huán)境搞了一下壓測,絕對是沒得問題的;但是,就在兩個月后的一天,系統(tǒng)銀攔襲突然跑的比烏龜還慢,投訴開始就陸續(xù)反饋過來了。
經(jīng)過排查,原來是頻繁執(zhí)行一條耗時100ms的SQL導(dǎo)致,100ms感覺不長,但就是把系統(tǒng)搞崩了,具體細(xì)節(jié)如下。
項目采用ABP進行開發(fā),集成統(tǒng)一的認(rèn)證中心(IDS4),部分?jǐn)?shù)據(jù)對接第三方系統(tǒng),拆分后的這個項目架構(gòu)相對簡單。
考慮并發(fā)量不高,就算是高峰期也不會超過1000,于是就搞了個單臺的數(shù)據(jù)庫服務(wù)器(MySQL),測試環(huán)境中經(jīng)過壓測,完全能抗住。
上線時,由于線上資源的關(guān)系,DB服務(wù)器的配置沒有按測試環(huán)境的標(biāo)準(zhǔn)來分配,相關(guān)人員想著后續(xù)看情況進行補配。上線推的比較緊,簡單評估了配置風(fēng)險,初步判斷沒啥大問題,于是就推上線了。
相關(guān)技術(shù)棧:ABP、IdentityServer4、Autofac、AutoMapper、Quartz.NET、EF Core、Redis、MySQL等,這都不重要,重要的是100ms的SQL把系統(tǒng)搞崩了。
由于系統(tǒng)相對不大,并沒有把分布式日志、調(diào)度監(jiān)控,性能監(jiān)控集成上去。
上線期間,前期處于使用推廣階段,一切正常。兩個月后的一天,系統(tǒng)處于使用高峰時段,突然陸續(xù)收到反饋:系統(tǒng)有點卡!??!于是趕緊進行排查。
由于系統(tǒng)已經(jīng)是集群部署的,慢這個問題首先懷疑是數(shù)據(jù)庫服務(wù)器,于是讓DBA的同事排查了一下,沒有鎖,只是有大量事務(wù)等待提交(waiting for handler commit),通過如下命令可查的:
看到都是插入審計日志記錄導(dǎo)致,一看日志記錄頻率,差不多一秒500條記錄。DBA同事說可能是記錄插入頻繁導(dǎo)致,此時CPU已經(jīng)爆到100%了,為了快速解決問題,于是就趕緊關(guān)掉了一些不必要的日志記錄。
這么一改衡困,稍微降了一點,沒有事務(wù)提交的記錄,系統(tǒng)勉強可以撐著用,但是CPU還是在85%~97%波動;
看到這種情況,當(dāng)然還是不放心,繼續(xù)排查。 中間有對服務(wù)器的配置產(chǎn)生過懷疑,但非??隙ǖ氖沁@不是主要原因,于是和DBA的同事繼續(xù)排查。
系統(tǒng)雖然可以正常使用,但時不時的也看看監(jiān)控屏,CPU一直處于高水位狀態(tài),還是有點慌的,因為一有問題,信息和都要爆。
突然DBA同事發(fā)現(xiàn)有一個單表查詢的SQL執(zhí)行比較頻繁,于是單獨拿出來試了一下,查詢時間150ms左右,這個表的數(shù)據(jù)量不大,8萬左右,但沒有加任何索引,因為想著數(shù)據(jù)量不大,查詢時長還可接受,所以當(dāng)時就沒有加相關(guān)索引。
定位到這條SQL后,想到的之一步就是增加索引,在測試環(huán)境上試了一把,執(zhí)行效率直接飛速提高到1ms;效果如下:
所以和DBA同事達成一致意見,在生成環(huán)境上增加復(fù)合索引(
創(chuàng)建索引一定要注意字段順序
),在中午時候,系統(tǒng)使用頻率不太高,于是就在生成上快速加了索引,我去,CPU一下降到了20%以內(nèi),意不意外;就算在使用高鋒兄峰期,也沒超過20%,通過zabbix工具監(jiān)控看到CPU的效果:
問題算是解決了,總算松了一口氣。
這里有個問題: CPU都爆了為什么沒有報警提醒,這塊DBA同事正在排查相關(guān)配置。這里發(fā)現(xiàn)CPU爆了,還是無意的遠程到服務(wù)器,發(fā)現(xiàn)很卡,一看CPU才知道爆了。
系統(tǒng)雖小,問題不大,但其實暴露的問題還是挺多。
這次線上小事故暫時分享到這,因為項目不大,所以沒有做那么多監(jiān)控,但以下建議,小伙伴可以參考一下:
abp換能器的位置放在哪里
abp換能器的放置放在患者右心房水平。根據(jù)查詢相關(guān)資料信息,排空管道中的空氣,敗御閉同時連接換能器與監(jiān)護儀的壓力模塊,選中ABP模式,將換能器固定在患者右心房水拆答平察裂,并進行校零。連接延長管和動脈插管。此時監(jiān)護儀上出現(xiàn)動脈波并顯示收縮壓、舒張壓和平均壓的數(shù)值。
關(guān)于abp 數(shù)據(jù)庫連接的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
網(wǎng)頁題目:如何實現(xiàn)abp框架中的數(shù)據(jù)庫連接?(abp數(shù)據(jù)庫連接)
鏈接地址:http://www.fisionsoft.com.cn/article/dpehhpp.html


咨詢
建站咨詢
