2013-04-11 42 views
-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

http://codereview.stackexchange.com – 2013-04-11 07:14:20

+0

什麼是'databaseManager'對象?什麼是ExecuteNonQuery方法? Шо? - корочеговоря – Andremoniy 2013-04-11 07:14:35

回答

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); 

無論是性能更好與否還很難說前期,但你可以衡量和決定它是否可以提高性能。

+0

嘗試過它,沒有幫助 – 2013-04-11 07:27:54

+0

您是否嘗試過使用(更新後的)示例?它使我獲得了1.000的時間增益... – mthmulders 2013-04-11 07:45:32

+0

是的,現在它的工作原理:) – 2013-04-11 08:57:29

2

永遠不要使用字符串來構建SQL查詢。使用PreparedStatement並設置佔位符。這既是類型安全的,也消除了SQL注入的風險。

如果您的查詢必須由於運行時條件而以編程方式生成,那麼請使用@mthmulders建議來構建準備好的語句。

+0

也許你可以展示如何使用'PreparedStatement'完成'INSERT INTO ... SELECT ... UNION'的構建。我同意''PreparedStatements''通常是一個不錯的選擇,但是不(看)如何構建這個查詢_作爲一個statement_。 – mthmulders 2013-04-11 08:08:19

+0

@mthmulders那麼,您可以像使用直接語句一樣構建PreparedStatement的字符串,以便將變量聯合添加到完整字符串中,然後用於創建PreparedStatement。唯一的缺點是,你必須重新迭代來設置佔位符。 – 2013-04-11 09:13:05