HarmonyOS鸿蒙Next中如何在taskpool开启的线程内进行关系型数据库的批量插入操作

HarmonyOS鸿蒙Next中如何在taskpool开启的线程内进行关系型数据库的批量插入操作 如何在taskpool开启的线程内,进行关系型数据库的批量插入操作?

3 回复

context需要传入到线程中。TaskPool和Worker的底层模型为Actor模型,基于Actor模型的内存隔离特性,执行多线程任务和取得结果需要通过跨线程序列化传输。目前支持传输的数据对象可以分为普通对象、可转移对象、可共享对象、Native绑定对象、Sendable对象五种。

EntryAbility.ets

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import Dbutil from '../common/DbUtil';

const TABLE_NAME: string = "EMPLOYEE"
const CREATE_TABLE_SQL: string = `
 CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (
   ID INTEGER PRIMARY KEY AUTOINCREMENT,
   NAME TEXT NOT NULL,
   AGE INTEGER NOT NULL,
   SALARY DOUBLE NOT NULL
 )
`

export default class EntryAbility extends UIAbility {
  async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    await Dbutil.initDB(this.context)
    Dbutil.createTable(CREATE_TABLE_SQL)
  }

  onDestroy(): void {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index5', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }

  onWindowStageDestroy(): void {
    // Main window is destroyed, release UI related resources
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  onForeground(): void {
    // Ability has brought to foreground
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  onBackground(): void {
    // Ability has back to background
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}
DbUtil.ets

import relationalStore from '@ohos.data.relationalStore'
import { ColumnInfo, ColumnType } from '../common/ColumnInfo'
import { BusinessError } from '@kit.BasicServicesKit'
import { ValuesBucket, ValueType } from '@kit.ArkData'

const DB_FILENAME: string = 'testMySql.db'

class DbUtil {
  rdbStore: relationalStore.RdbStore | undefined = undefined

  initDB(context: Context): Promise<void> {
    let config: relationalStore.StoreConfig = {
      name: DB_FILENAME,
      securityLevel: relationalStore.SecurityLevel.S1
    }
    return new Promise((resolve, reject) => {
      relationalStore.getRdbStore(context, config)
        .then(rdbStore => {
          this.rdbStore = rdbStore
          console.debug('rdbStore 初始化完成!')
          resolve()
        })
        .catch(err => {
          console.error('rdbStore 初始化异常', JSON.stringify(err))
          reject(err)
        })
    })
  }

  isInited() {
    return !!this.rdbStore
  }

  createTable(sql: string): Promise<void> {
    return new Promise((resolve, reject) => {
      if (this.rdbStore){
        this.rdbStore.executeSql(sql)
          .then(() => {
            console.debug('创建成功', sql)
            resolve()
          })
          .catch(err => {
            console.error('创建失败,' + err.message, JSON.stringify(err))
          })
      }
    })
  }

  async insertTest(tableName: string, value: ValuesBucket): Promise<number> {
    return await new Promise((resolve, reject) => {
      console.debug('insertTest1111')
      if (!this.rdbStore) return
      console.debug('insertTest2222')
      this.rdbStore.insert(tableName, value, (err, id) => {
        if (err) {
          console.error('新增失败!', JSON.stringify(err))
          reject(err)
        } else {
          console.debug('新增成功!新增id:', id.toString())
          resolve(id)
        }
      })
    })
  }

  queryForListPrint(tableName: string){
    let predicates = new relationalStore.RdbPredicates(tableName);
    predicates.equalTo("NAME", "Rose");
    if(this.rdbStore != undefined) {
      (this.rdbStore as relationalStore.RdbStore).query(predicates, ["ID", "NAME", "AGE", "SALARY"]).then(resultSet => {
        console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);
        // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
        while (resultSet.goToNextRow()) {
          const id = resultSet.getLong(resultSet.getColumnIndex("ID"));
          const name = resultSet.getString(resultSet.getColumnIndex("NAME"));
          const age = resultSet.getLong(resultSet.getColumnIndex("AGE"));
          const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY"));
          console.info(`id=${id}, name=${name}, age=${age}, salary=${salary}`);
        }
        // 释放数据集的内存
        resultSet.close();
      }).catch(err => {
        console.error(`Query failed, code is ${err.code},message is ${err.message}`);
      })
    }
  }
}

const dbUtil: DbUtil = new DbUtil()

export default dbUtil as DbUtil

更多关于HarmonyOS鸿蒙Next中如何在taskpool开启的线程内进行关系型数据库的批量插入操作的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,使用taskpool开启的线程内进行关系型数据库的批量插入操作,可以通过以下步骤实现:

  1. 创建数据库并定义表结构:首先,使用RdbStore创建数据库,并定义表结构。

  2. 使用taskpool开启线程:通过taskpool.execute方法开启一个线程,将数据库操作放在该线程中执行。

  3. 批量插入数据:在taskpool线程中,使用RdbStoreexecuteSql方法或batchInsert方法进行批量插入操作。

以下是一个示例代码:

import taskpool from '@ohos.taskpool';
import relationalStore from '@ohos.data.relationalStore';

// 定义数据库表结构
const SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)";

// 初始化数据库
let rdbStore;
async function initDatabase() {
    const config = {
        name: 'test.db',
        securityLevel: relationalStore.SecurityLevel.S1
    };
    rdbStore = await relationalStore.getRdbStore(globalThis.context, config);
    await rdbStore.executeSql(SQL_CREATE_TABLE);
}

// 批量插入数据
async function batchInsertData(records) {
    await rdbStore.beginTransaction();
    try {
        for (let record of records) {
            await rdbStore.insert('test', record);
        }
        await rdbStore.commit();
    } catch (e) {
        await rdbStore.rollback();
        throw e;
    }
}

// 使用taskpool开启线程执行批量插入
async function executeBatchInsertInTaskPool(records) {
    await taskpool.execute(async () => {
        await batchInsertData(records);
    });
}

// 初始化数据库并执行批量插入
async function main() {
    await initDatabase();
    const records = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];
    await executeBatchInsertInTaskPool(records);
}

main();

在这个示例中,initDatabase函数用于初始化数据库并创建表,batchInsertData函数用于批量插入数据,executeBatchInsertInTaskPool函数通过taskpool.execute方法在子线程中执行批量插入操作。

在HarmonyOS鸿蒙Next中,使用taskpool开启线程进行关系型数据库的批量插入操作,可以通过以下步骤实现:

  1. 创建数据库连接:在主线程中创建数据库连接,并获取数据库对象。
  2. 定义任务函数:在taskpool中定义任务函数,接收数据库对象和数据列表。
  3. 开启事务:在任务函数中开启事务,确保批量插入的原子性。
  4. 执行批量插入:遍历数据列表,执行插入操作。
  5. 提交事务:插入完成后提交事务。
  6. 关闭数据库:在任务函数结束时关闭数据库连接。

通过taskpool.execute执行任务函数,实现并发批量插入。

回到顶部