2012-04-05 5 views
4

Я пытаюсь оптимизировать скорость, которую моя локальная база данных заполняет в разрабатываемом веб-приложении. В настоящее время он использует PHP для доступа к базе данных и затем вставляет эти данные в локальную базу данных с помощью Javascript.Оптимизация локальной базы данных WebSQL

Проблема заключается в том, что что-то большее, чем пара записей замедляет ее, и я уверен, что это потому, что она выполняет отдельный SQL-запрос для КАЖДОЙ строки. Я читал транзакции (Commits and Rollbacks, а что нет), и это похоже на ответ, но я не совсем уверен, как его реализовать или даже где.

Ниже приведен пример одной из функций, которые загружают конкретную таблицу.

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 для вставки его и Javascript, который запускает PHP-код.

ответ

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

Edit: запрос с заполнителями имеет два основных преимущества:

  1. Это делает его намного проще для двигателя DB для кеш и повторно использовать планы запросов (потому что вы используете один и тот же запрос в сто раз вместо ста разных запросов один раз).
  2. Это ускользает от данных и позволяет избежать инъекций SQL намного проще.
+0

Я не понимаю, использование подчеркивания в строке 3. –

+0

@Pedro: это часть [underscore.js] (http://documentcloud.github.com/underscore/), '_ (массив) .each' работает так же, как 'forEach', выполняет заданную функцию для каждого элемента в' array'. – DCoder

+0

Что делать, если одна из вставок не работает, как управлять транзакциями. Поскольку каждый executeSQL является асинхронным, он может вставить другой SQL перед сбоем. Есть ли способ обойти это. – VikrantY

Смежные вопросы