-2

所以我有这段代码可以将代理列表添加到本地 SQLite 数据库作为一条 sql 指令。

public void Add(List<Broker> brokers)
{
    if(brokers == null || brokers.size() == 0)
      return;

    String sql = "INSERT INTO " + TABLE_NAME + " SELECT " + brokers.get(0).getId() + " AS '" + COLUMN_BROKERID + "', "+ brokers.get(0).getOfficeId() + " AS '" + COLUMN_OFFICEID +  "', '"+ brokers.get(0).getName() + "' AS '" + COLUMN_NAME +  "', "+ brokers.get(0).getSuccessRate() + " AS '" + COLUMN_SUCCESSRATE +  "'";

    for(int i=1; i<brokers.size(); i++)
    {
        sql = sql + " UNION SELECT " + brokers.get(i).getId() + ", " + brokers.get(i).getOfficeId() + ", '" + brokers.get(i).getName() + "', " + brokers.get(i).getSuccessRate();
    }

    databaseManager.ExecuteNonQuery(sql);
 }

但是,使这种速度减慢很多的是字符串“sql”的变化。最后一行,这是一个调用,ExecuteNonQuery()需要一毫秒,但上面需要很多。我怎样才能加快速度?

4

2 回答 2

2

永远不要使用字符串来构建 SQL 查询。

相反,使用PreparedStatement并设置占位符。这既是类型安全的,又消除了 SQL 注入的风险。

如果您的查询由于运行时的条件而必须以编程方式构建,请使用@mthmulders 建议来构建准备好的语句。

于 2013-04-11T07:45:27.987 回答
0

首先,我建议使用 aStringBuilder来构建您的查询字符串。请注意,它不是线程安全的;如果需要,请使用StringBuffer.

它大致看起来像这样:

    StringBuilder sb = new StringBuilder();
    sb.append("INSERT INTO ");
    sb.append(TABLE_NAME);
    sb.append(" SELECT ");
    sb.append(brokers.get(0).getId());
    sb.append(" AS '");
    sb.append(COLUMN_BROKERID);

使用 10.000 个代理,原始方法在我的机器上需要 13984 毫秒。重构为 aStringBuilder将其缩小到 15 或 16 毫秒。

接下来,您可以尝试使用字符串格式化。它大致看起来像这样:

String test = String.format("INSERT INTO %1...", TABLE_NAME);

很难说它是否表现更好,但你可以衡量它并决定它是否会提高性能。

于 2013-04-11T07:16:36.397 回答