2012-04-05 6 views
4

J'essaie d'optimiser la vitesse de remplissage de ma base de données locale dans une application Web en cours de développement. Actuellement, il utilise PHP pour accéder à la base de données, puis insère ces données dans la base de données locale en utilisant Javascript.Optimisation de la base de données locale WebSQL

Problème est, quoi que ce soit plus d'une paire d'entrées le ralentit et je suis sûr que c'est parce qu'il exécute une requête SQL individuelle pour CHAQUE ligne. J'ai lu des transactions (Commits et Rollbacks et autres) et cela semble être une réponse, mais je ne suis pas tout à fait sûr de savoir comment l'implémenter, ou même où.

Voici un exemple d'une des fonctions qui charge une table particulière.

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

// Ceci Se connecte à la base de données réelle d'où proviennent les informations.

$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; 
} 

Je ne sais pas ce qui a besoin de la transaction (ou même si c'est ce qui doit être fait). Il y a MSSQL pour accéder aux données, SQLite pour l'insérer et Javascript pour le code PHP.

Répondre

14

Je voudrais préparer une requête avec des espaces réservés, puis l'exécuter pour chaque ligne avec les bons arguments. Quelque chose comme ça (partie JS uniquement, en utilisant underscore.js pour les aides du tableau):

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: une requête avec des espaces réservés a deux avantages principaux:

  1. Il rend beaucoup plus facile pour le moteur DB mettre en cache et réutiliser les plans de requête (car vous exécutez la même requête une centaine de fois au lieu d'une centaine de requêtes différentes).
  2. Il permet d'éviter les données et d'éviter les injections SQL.
+0

Je ne comprends pas l'utilisation du trait de soulignement sur la ligne 3. –

+0

@Pedro: cela fait partie de [underscore.js] (http://documentcloud.github.com/underscore/), '_ (array) .each fonctionne exactement comme 'forEach', exécute la fonction donnée pour chaque élément du' array'. – DCoder

+0

Et si l'une des insertions échouait, comment les transactions seraient-elles gérées? Puisque chaque executeSQL est asynchrone, il peut insérer l'autre SQL avant d'échouer. Y a-t-il un moyen de contourner cela? – VikrantY

Questions connexes