优化WebSQL本地数据库群

时间:2012-04-05 15:34:25

标签: php javascript sqlite web-sql

我正在尝试优化我的本地数据库在正在开发的Web应用程序中填充的速度。目前,它使用PHP访问数据库,然后使用Javascript将该数据插入本地数据库。

问题是,除了几个条目之外的任何东西都会减慢速度,我很确定这是因为它为每一行执行单独的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。

1 个答案:

答案 0 :(得分: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注入。