[Muziが1日あたり1,000以上の収入をどのように見ているかを見てください。これは、映画やテレビ向けの最新の小さな番組を作成するプロセス全体の詳細な説明です] MyBatisの3つのバッチ挿入方法の比較!

ビデオ番組は非常に人気があり、主な収益化方法はトラフィックを収益化することです。それを上手く行えば、1日数千ドルを稼ぐことができます。上手く行けば、月収1wは通常です。

あなたがそれについて考えることができれば、あなたはお互いから推論を引き出し、同じ方法で同じ操作をすることによってより多くのお金を稼ぐ方法を考えることができます。あなたがそれを考えることができるならば、あなたの資格おめでとうございます。

このテクノロジーに1,000を請求するのは費用がかかりません。結局のところ、他の人のために小さなプログラムを構築するには数百を請求する必要があります。技術的なプロセスを共有した後、お金を稼ぐ方法はあなた自身の能力に依存します!
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
データベースはsqlserver、JDKバージョン1.8を使用し、SpringBoot環境で実行して、使用可能な3つの方法を比較します。

1.単一の挿入ステートメントを繰り返し実行します
2.xmlスプライシングSQL3
。バッチ実行
結論から始めましょう:少量の挿入には単一のデータの繰り返し挿入を使用してください。これは便利です。大量の場合は、バッチ処理を使用してください。(20個程度のデータを境界として挿入することを検討できます。私のテストおよびデータベース環境では、時間は100ミリ秒です。利便性が最も重要です)。xmlスプライシングSQLを使用しない場合は関係ありません。
コード

スプライシングSQLのxmlnewId()は、UUIDを生成するsqlserverの関数であり、この記事の内容とは関係ありません。

<insert id="insertByBatch" parameterType="java.util.List">
    INSERT INTO tb_item VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (newId(),#{
    
    item.uniqueCode},#{
    
    item.projectId},#{
    
    item.name},#{
    
    item.type},#{
    
    item.packageUnique},
        #{
    
    item.isPackage},#{
    
    item.factoryId},#{
    
    item.projectName},#{
    
    item.spec},#{
    
    item.length},#{
    
    item.weight},
        #{
    
    item.material},#{
    
    item.setupPosition},#{
    
    item.areaPosition},#{
    
    item.bottomHeight},#{
    
    item.topHeight},
        #{
    
    item.serialNumber},#{
    
    item.createTime}</foreach>
</insert>

マッパーインターフェースマッパーはmybatisプラグインtk.Mapperのインターフェースであり、この記事の内容とはほとんど関係がありません。

public interface ItemMapper extends Mapper<Item> {
    
    
    int insertByBatch(List<Item> itemList);
}

サービスクラス

@Service
public class ItemService {
    
    
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    //批处理
    @Transactional
    public void add(List<Item> itemList) {
    
    
        SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
        ItemMapper mapper = session.getMapper(ItemMapper.class);
        for (int i = 0; i < itemList.size(); i++) {
    
    
            mapper.insertSelective(itemList.get(i));
            if(i%1000==999){
    
    //每1000条提交一次防止内存溢出
                session.commit();
                session.clearCache();
            }
        }
        session.commit();
        session.clearCache();
    }
    //拼接sql
    @Transactional
    public void add1(List<Item> itemList) {
    
    
        itemList.insertByBatch(itemMapper::insertSelective);
    }
    //循环插入
    @Transactional
    public void add2(List<Item> itemList) {
    
    
        itemList.forEach(itemMapper::insertSelective);
    }
}

テストクラス

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ApplicationBoot.class)
public class ItemServiceTest {
    
    
    @Autowired
    ItemService itemService;

    private List<Item> itemList = new ArrayList<>();
    //生成测试List
    @Before 
    public void createList(){
    
    
        String json ="{\n" +
                "        \"areaPosition\": \"TEST\",\n" +
                "        \"bottomHeight\": 5,\n" +
                "        \"factoryId\": \"0\",\n" +
                "        \"length\": 233.233,\n" +
                "        \"material\": \"Q345B\",\n" +
                "        \"name\": \"TEST\",\n" +
                "        \"package\": false,\n" +
                "        \"packageUnique\": \"45f8a0ba0bf048839df85f32ebe5bb81\",\n" +
                "        \"projectId\": \"094b5eb5e0384bb1aaa822880a428b6d\",\n" +
                "        \"projectName\": \"项目_TEST1\",\n" +
                "        \"serialNumber\": \"1/2\",\n" +
                "        \"setupPosition\": \"1B柱\",\n" +
                "        \"spec\": \"200X200X200\",\n" +
                "        \"topHeight\": 10,\n" +
                "        \"type\": \"Steel\",\n" +
                "        \"uniqueCode\": \"12344312\",\n" +
                "        \"weight\": 100\n" +
                "    }";
        Item test1 = JSON.parseObject(json,Item.class);
        test1.setCreateTime(new Date());
        for (int i = 0; i < 1000; i++) {
    
    //测试会修改此数量
            itemList.add(test1);
        }
    }
     //批处理
    @Test
    @Transactional
    public void tesInsert() {
    
    
        itemService.add(itemList);
    }
    //拼接字符串
    @Test
    @Transactional
    public void testInsert1(){
    
    
        itemService.add1(itemList);
    }
    //循环插入
    @Test
    @Transactional
    public void testInsert2(){
    
    
        itemService.add2(itemList);
    }
}

試験結果:

10 25のデータ挿入は何度もテストされており、変動性は大きいですが、基本的には100ミリ秒のレベルです。
ここに画像の説明を挿入
スプライシングSQLメソッドは、500および1000のデータを挿入するときにエラーを報告します(SQLステートメントが長すぎます。これはデータベースタイプに関連しています。関連、他のデータベーステストはありません):com.microsoft.sqlserver.jdbc.SQLServerException:着信表形式データストリーム(TDS)リモートプロシージャコール(RPC)プロトコルストリームが正しくありません。このRPC要求で提供されたパラメーターが多すぎます。最大で2100である必要があります

それは発見することができます

1.循環挿入の時間計算量はO(n)であり、定数Cは非常に大きいです
。2 スプライシングSQL挿入の時間計算量(should)はO(logn)ですが、成功した完了の数は多くありません。わからない
3.バッチ処理効率の時間計算量はO(logn)であり、定数Cも比較的小さい

結論として

単一のデータを循環的に挿入する効率は非常に低いですが、コードの量は非常に少ないです。tk.Mapperプラグインを使用する場合、必要なのはコードだけです。

@Transactional
public void add1(List<Item> itemList) {
    
    
    itemList.forEach(itemMapper::insertSelective);
}

したがって、挿入するデータ量が少ない場合に使用する必要があります。

xmlスプライシングsqlは、最も推奨されない方法です。使用するときに書き込むxmlステートメントとsqlステートメントがたくさんあり、間違いを犯しやすく、作業効率が非常に低くなります。さらに重要な点は、効率は許容範囲内ですが、本当に効率が必要な場合は電話を切るということです。どのような用途が必要ですか。

大量のデータを挿入する場合は、バッチ実行をお勧めします。また、使用する方が便利です。

おすすめ

転載: blog.csdn.net/ncw8080/article/details/113863439