2012-04-05 36 views
4

我正在嘗試優化本地數據庫在正在開發的Web應用程序中填充的速度。目前,它使用PHP訪問數據庫,然後使用Javascript將該數據插入到本地數據庫中。優化WebSQL本地數據庫人口

問題是,除了一些條目之外的任何東西都會降低速度,我非常肯定這是因爲它爲每行執行單獨的SQL查詢。我一直在閱讀交易(提交和回滾,不是),這似乎是一個答案,但我不完全知道如何實現它,甚至在哪裏。

以下是加載特定表的函數之一的示例。

function ploadcostcodes() 
{ 
$IPAddress = ''; 
$User = ''; 
$Password = ''; 
$Database = ''; 
$Company = ''; 
$No=''; 
$Name=''; 
ploadSQLConnection($IPAddress,$User,$Password,$Database,$Company); 

//此連接到信息來自的實際數據庫。

$Login = 'XXXXXXX'; 
$conn=mssql_connect($IPAddress,$Login,$Password); 
if (!$conn) 
{ 
     die(print_r('Unable to connect to server', true)); 
} 
mssql_select_db($Database, $conn); 

$indent="  "; 

$sql="SELECT Cost_Code_No as No, Description as Name, Unit_of_Measure FROM v_md_allowed_user_cost_codes WHERE Company_No = " . $Company . " and User_No = '" . $User . "'"; 

$rs=mssql_query($sql); 
if (!$rs) 
{ 
    exit("No Data Found"); 
} 

while ($row = mssql_fetch_array($rs)) 
{ 
    $No = addslashes($row['No']); 
    $Name = addslashes($row['Name']); 
    $Name = str_replace("'",'`',$Name); 
    $Unit = addslashes($row['Unit_of_Measure']); 

    //THIS IS WHERE I SEE THE PROBLEM 

    echo $indent."exeSQL(\"INSERT INTO Cost_Codes (Cost_Code_No,Name,Unit_of_Measure) VALUES('".$No."','".$Name."','".$Unit."')\",\"Loading Cost Codes...\"); \r\n"; 
} 
mssql_free_result($rs); 
mssql_close($conn); 
return 0; 
} 

我不知道需要什麼事務(或者即使這是需要做的)。有MSSQL訪問數據,SQLite插入它和運行PHP代碼的Javascript。

回答

14

我會用佔位符準備一個查詢,然後用正確的參數爲每一行執行它。像這樣的東西(JS只是一部分,使用underscore.js數組傭工):

db.transaction(function(tx) { 
    var q = 'INSERT INTO Cost_Codes (Cost_Code_No, Name, Unit_Of_Measure) VALUES (?, ?, ?)'; 
    _(rows).each(function(row) { 
     tx.executeSql(q, [row.code, row.name, row.unit]); 
    }); 
}); 

編輯:佔位符查詢有兩大好處:

  1. 這使得它更容易很多關於數據庫引擎緩存和重用查詢計劃(因爲您運行的是同一個查詢,而不是一百次不同的查詢)。
  2. 它使轉義數據和避免SQL注入變得更容易。
+0

我不明白在第3行使用下劃線。 – 2012-05-02 20:45:53

+0

@Pedro:它是[underscore.js](http://documentcloud.github.com/underscore/)的一部分,'_(array ).each'就像'forEach'一樣工作,爲'array'中的每個元素執行給定的函數。 – DCoder 2012-05-03 04:03:16

+0

如果其中一個插入失敗,那麼如何管理事務呢?由於每個executeSQL都是異步的,它可能會在失敗之前插入其他SQL。有沒有辦法解決這個問題。 – VikrantY 2013-09-08 13:04:01