如何使用多线程正确写入数据库?

问题描述 投票:0回答:1

我正在尝试使用 Rust 从多个线程写入单个数据库,我需要将大量行写入数据库,因此使用单个线程,该过程非常慢(30 分钟或更长),因为这是为了测试我决定添加更多线程,问题是它似乎并没有使进程的速度提高很多。

关于如何在 Rust 上正确执行此操作有什么建议吗?这是我现在拥有的代码,我正在考虑管理重试,因为有时线程会恐慌,因为它们发现数据库已锁定,这超出了这个具体问题,但如果您也想提供帮助,无论如何都会受到赞赏:

#[cfg(test)]
mod tests {

    use std::{sync::{atomic::{AtomicU32, Ordering}, Arc}, thread, time};
    use common::store::StoreConnection;
    use reports::bat_osc::BatOscData;

    const TEST_DB: &str = "/tmp/test_database.db";

    fn write_entries(count: &AtomicU32) {
        while count.load(Ordering::Relaxed) < 7000000 {
  
            if count.load(Ordering::Relaxed) % 1000 == 0 {
                println!("{}", count.load(Ordering::Relaxed));
            }

            let store = StoreConnection::new(TEST_DB, reports::bat_osc::BAT_OSC_TABLE)
            .unwrap()
            .writer(2592000 * 2)
            .unwrap();
        
            let data = BatOscData {
                ..Default::default()
            };

            let _ = store.insert(data);
            count.fetch_add(1, Ordering::Relaxed);
        }
    }
    

    #[test]
    fn write_a_lot() {
        let count = Arc::new(AtomicU32::new(0));
        let mut handles = vec![];

        // Create several threads
        for _ in 0..1000 {
            let count_clone = Arc::clone(&count);
            let handle = thread::spawn(move || {
                write_entries(&count_clone);
            });
            handles.push(handle);
        }

        // Join all the threads
        for handle in handles {
            handle.join().expect("Thread panicked");
        }

    }
}

尝试使用多个线程写入数据库以提高进程速度。速度根本没有增加。

database multithreading testing rust
1个回答
0
投票

使用批处理可以大大提高性能,但多线程没有,如果有人需要实现相同的效果,我最终遵循了本指南:https://avi.im/blag/2021/fast-sqlite-inserts/

© www.soinside.com 2019 - 2024. All rights reserved.