update

28810
2019-01-26 00:01:46 +08:00
parent 203d7a54ca
commit f730ac4abf

@@ -37,6 +37,55 @@ FreeSql以微小的性能差距输了原因是支持了更多的类型
> FreeSql批量插入使用的命令INSERT INTO Song (...) VALUES(...),VALUES(...),VALUES(...)...
## 并发测试
Dapper以及其他ORM包括EFCore默认使用ado.net的连接池FreeSql独立现实了连接池机制。假设连接池数量都为100的情况下请看以下测试结果
```csharp
[HttpGet("vs_freesql")]
async public Task<object> vs_freesql() {
var select = mysql.Select<Song>();
var count = await select.CountAsync();
using (var conn = await mysql.Ado.MasterPool.GetAsync()) {
System.Threading.Thread.CurrentThread.Join(TimeSpan.FromMilliseconds(500));
}
var items = await select.Page(1, 20).ToListAsync();
return new { count, items };
}
[HttpGet("vs_dapper")]
async public Task<object> vs_dapper()
{
//与freesql执行相同的SQL命令
//将dapper的连接池大小调为101防止与freesql共用
var connStr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=101";
var conn = new MySqlConnection(connStr);
conn.Open();
var count = await conn.ExecuteScalarAsync<int>("SELECT count(1) FROM `Song` a");
//conn.Close();
System.Threading.Thread.CurrentThread.Join(TimeSpan.FromMilliseconds(500));
//conn = new SqlConnection(connStr);
//conn.Open();
var items = await conn.QueryAsync<Song>("SELECT a.`Id`, a.`Title`, a.`Url`, a.`Create_time`, a.`Is_deleted` FROM `Song` a LIMIT 0,20");
conn.Close();
return new { count, items };
}
```
连接池最大为100101
Song 表数据13万
在中间都模拟占用连接池的连接500ms时间来阻塞后续的请求正式环境一条命令或事务500ms是很正常的耗时。
ab -c 50 -n 1000 -s 6000 测试结果差不多,基本小于连接池数量都差不多。
-c 500 时vs_dapper直接挂了vs_freesql没影响。
测试结果证明ado.net连接池过于暴露突然的高并发招架不住。
### 执行SQL返回实体列表
```csharp
@@ -87,7 +136,7 @@ public void QueryTuple() {
```csharp
[Fact]
public void Query() {
public void QueryDynamic() {
var sb = new StringBuilder();
var time = new Stopwatch();
@@ -110,7 +159,7 @@ public void Query() {
```csharp
[Fact]
public void Query() {
public void QueryList() {
var sb = new StringBuilder();
var time = new Stopwatch();