數(shù)據(jù)庫開發(fā)筆記
MYSQL數(shù)據(jù)庫的連接庫有兩種:
Mysql.Data:官方的庫。
MySqlConnector:社區(qū)開源庫
有不少人推薦使用MySqlConnector,說是可能性能更好,更快一點。
MYSQL數(shù)據(jù)庫使用過程中發(fā)現(xiàn)一個問題,如果長期不操作數(shù)據(jù)庫,比方說幾個小時不操作,后面再去操作的時候,經(jīng)常有時候會連接失敗,或者卡在那里卡半天,才會有反應。
因為是內(nèi)部的連接池已經(jīng)斷開了。
這個問題之前被困擾了很久,嘗試了不少的庫,發(fā)現(xiàn)都有這個問題。
Data Source=xxx.xxx.xxx.xxx;Port=3306;User ID=username;Password=password;Initial Catalog=databaseName;Charset=utf8mb4;SslMode=none;Pooling=true;ConnectionIdleTimeout=180;ConnectionLifeTime=600;Keepalive=30;MaxPoolSize=100;MinPoolSize=1;
其實是MYSQL服務器對長期沒有操作的連接對象,會去主動斷開釋放。
MYSQL客戶端這邊不知道連接已經(jīng)被斷開了,再去連的時候,會發(fā)現(xiàn)一直連不上,一直等到超時,才會去新鏈接去連接。這段時間可能前臺就一直等著數(shù)據(jù)。
上面的連接串的主要作用是主動設置一個空置超時時間,就是客戶端這邊自己發(fā)現(xiàn)某個連接閑置多少時間了以后,自己主動去釋放回收。這樣下次要用的時候,就不會用到已經(jīng)斷開的連接。
這個時間要設置成一個比較合理的時候,不斷頻繁地去斷開重連,其實也會影響整體的性能。
ConnectionLifeTime設置的是連接對象的整體生命周期。到了這個時間以后,不管有沒有在用,都去釋放掉,起個新的連接。說是生命周期太長,長時間使用,也可能會有性能的問題。
MinPoolSize和MaxPoolSize是最小和最大連接池數(shù)量。MinPoolSize=1的話,就是相當于保證連接池里最少有一個連接是隨時可用的。根據(jù)實際情況來設置,保證性能的情況下,設置小的一點的數(shù)量,不然占用服務器資源。
對應的FreeSQL也有兩種類庫:FreeSql.Provider.MySql和FreeSql.Provider.MySqlConnector,相當于一個使用官方的庫,一個是使用MySqlConnector。
前面說的閑置超時的設置,貌似只有在MySqlConnector里面有,官方的庫設置這個參數(shù)會報錯。
所以現(xiàn)在很多的MYSQL庫,我都改用MySqlConnector了。
這段時間部分項目我也有在用微軟的Microsoft.EntityFrameworkCore。
官方支持的SQLite和SQL Server。MYSQL屬于社區(qū)支持,沒前兩者好。
所以部分用SQLite的項目,我也使用Microsoft.EntityFrameworkCore.Sqlite。
這個庫的優(yōu)點是,接口更簡潔、方便。
也能自動創(chuàng)建庫表,但是和FreeSQL的區(qū)別是,EFCore只會在庫表不存在的時候才會去創(chuàng)建,不會去主動更新。如果需要更新的話,需要自己用工具和命令手動去更新。
優(yōu)點是,不容易誤操作,不會引發(fā)毀滅性的數(shù)據(jù)誤操作。缺點是更新稍微麻煩一點。
但是FreeSQL的自動同步表功能其實也是比較危險的功能。在實際業(yè)務場景里面用非常的危險,最好也是不要啟用。
另一個Dapper也在使用。更靈活,也是這三種里面速度最快的。
FreeSQL前面在使用的時候,發(fā)現(xiàn)一個表里,我只加載部分字段,弄起來稍微麻煩。Dapper因為是直接使用SQL來進行查詢和操作的,反而有時候顯得更加靈活,更加可控。
這三種里面,目前使用最多的還是FreeSQL。
Dapper會在一些比較需要用到復雜和細致操作的時候使用。
EFCore一般是在一些只用到SQLite的項目里面使用。

浙公網(wǎng)安備 33010602011771號