2012-04-05 79 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