如何优化这个?

时间:2013-04-11 07:12:43

标签: java sql optimization

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

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()的调用需要一毫秒,但上述内容需要花费很多时间。我怎样才能加快速度呢?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

首先,我建议使用StringBuilder来构建查询字符串。请注意,它不是线程安全的;如果您需要,请使用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毫秒。重构为StringBuilder会将其缩小到15或16毫秒。

接下来,您可以尝试使用String formatting。它大致如下:

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

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