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=10";
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, connstr)
.UseAutoSyncStructure(true) //自动同步实体结构到数据库
.Build();
[Table(Name = "tb_topic")]
class Topic {
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
一括挿入
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
fsql.Insert<Topic>(items).ExecuteAffrows();
次のようにSQLを実行します。
INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`)
VALUES(?Clicks0, ?Title0, ?CreateTime0),
(?Clicks1, ?Title1, ?CreateTime1),
(?Clicks2, ?Title2, ?CreateTime2),
(?Clicks3, ?Title3, ?CreateTime3),
(?Clicks4, ?Title4, ?CreateTime4),
(?Clicks5, ?Title5, ?CreateTime5),
(?Clicks6, ?Title6, ?CreateTime6),
(?Clicks7, ?Title7, ?CreateTime7),
(?Clicks8, ?Title8, ?CreateTime8),
(?Clicks9, ?Title9, ?CreateTime9)
内装
大容量データに挿入されたとき、内部使用分割ロジックは、バッチ式で行われます。次のようにセグメンテーションルールは以下のとおりです。
数量 | パラメータの量 | |
---|---|---|
MySQLの | 5000 | 3000 |
PostgreSQLの | 5000 | 3000 |
SQLサーバー | 1000年 | 2100 |
オラクル | 500 | 999 |
sqliteの | 5000 | 999 |
データ:バルクデータ挿入10000として各バッチの大きさを、分割は、実行は、MySQLは、二つのバッチに分割される時。
パラメータ量:量は、バルクデータ挿入10000としてバッチ分割パラメータは、分割を各バッチのMySQL 5分の3000を実行する際に必要な5つのパラメータの各行のサイズです。
セグメンテーションを実行した後、トランザクションが開いてから内部トランザクションの外側に設けられていないときに挿入の整合性を実現しています。
FreeSql適合パラメトリック各データ・タイプ、及びノンパラメトリック使用。バルクは、パラメトリック機能の提案閉鎖を挿入し、.NonoParameter()の実行(今後の記事で取り上げに関するNoneParameter)を使用します。
パフォーマンスリファレンス
API
方法 | 返却値 | パラメータ | 説明 |
---|---|---|---|
AppendData | <この> | T1 | IEnumerableを
|
挿入のために意図され、追加のエンティティ |
ToSql | 弦 | 実行するSQL文を返します。 | |
ExecuteAffrows | 長いです | SQL文を実行する行数、リターンの影響 | |
ExecuteIdentity | 長いです | 付加価値から返すSQL文を実行 | |
ExecuteInserted | 一覧<T1> | レコードの挿入が返された後、SQL文を実行 |