所以我有这段代码将一个代理列表作为单个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()
的调用需要一毫秒,但上述内容需要花费很多时间。我怎样才能加快速度呢?
答案 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);
是否表现更好是很难说的,但是你可以衡量它并决定它是否会提高性能。