2013-04-02 1 views
0

일부 webSQL 테이블을 업데이트하는 코드가 있지만 다른 트랜잭션 내부의 다른 트랜잭션 내부의 트랜잭션입니다. 테이블을 업데이트하는 데 꽤 오랜 시간이 걸리지 만 CREATE/INSERT 값에는 정상적인 시간이 걸립니다. 나는 다음과 같은 코드를 가지고 웹 서비스에 AJAX 성공 콜백 안쪽 (? 걸리는 시간)을 webSQL 트랜잭션의 성능WebSQL 성능 문제 - 많은 양의 데이터 업데이트

를 볼 수있는 방법이 있나요 :

function handleOrderNote(value, tx, ite) { 
tx.executeSql('SELECT * FROM MobileOrder where MobileOrderID = ?', [value.mobileOrder.mobileOrderID], 
    function (tx, result) { 
     function updateCreateOrderNote(tx, result, nResultadosIn, ite) { 
      if (nResultadosIn > 0) { 
       function updateOrderNote(value2, tx, ite) { 
        tx.executeSql('UPDATE MobileOrder SET CompanyID =?, CustomerID =?, OrderDate = ?, TotalQtt = ?, TotalCost = ?, UserPHC=?, HeaderID=?, OrderState=?, Observations=?, Status = ? WHERE MobileOrderID = ?', [value2.mobileOrder.companyID, value2.mobileOrder.customerID, value2.mobileOrder.orderDate, value2.mobileOrder.totalQtt, value2.mobileOrder.totalCost, value2.mobileOrder.userPHC, value2.mobileOrder.headerID, value2.mobileOrder.orderState, value2.mobileOrder.observations, value2.mobileOrder.status, value2.mobileOrder.mobileOrderID], 
         function (tx, result) { 
          function searchEqualOrderNote(value3, tx, ite) { 
           tx.executeSql('SELECT * FROM MobileOrderDetail where MobileOrderDetailID = ?', [value3.mobileOrderDetailID], 
            function (tx, result) { 
             function updateCreateLineOrderNote(tx, result, nResultadosIn, ite, value3) { 
              if (nResultadosIn > 0) { 
               function updateLineOrderNote(value4, tx, ite) { 
                tx.executeSql('UPDATE MobileOrderDetail SET MobileOrderID =?, Ref =?, CompanyID = ?, Discount = ?, Qtt = ?, TotalDetail=?, DetailID=? WHERE MobileOrderDetailID = ?', [value4.mobileOrderID, value4.ref, value4.companyID, value4.discount, value4.qtt, value4.totalDetail, value4.detailID, value4.mobileOrderDetailID], 
                 function (tx, result) {} 
                ); 
               } 
               updateLineOrderNote(value3, tx, ite); 
              } else { 
               function createLineOrderNote(value4, tx, ite) { 
                tx.executeSql('INSERT INTO MobileOrderDetail (MobileOrderDetailID, MobileOrderID, Ref, CompanyID, Discount, Qtt, TotalDetail, DetailID) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [value4.mobileOrderDetailID, value4.mobileOrderID, value4.ref, value4.companyID, value4.discount, value4.qtt, value4.totalDetail, value4.detailID], 
                 function (tx, result) {}); 
               } 
               createLineOrderNote(value3, tx, ite); 
              } 
             } 

             updateCreateLineOrderNote(tx, result, result.rows.length, ite, value3); 
            }); 
          } 
          for (var i = 0; i < value2.mobileOrderDetail.length; i++) { 
           var linhaNotaEncomenda = value2.mobileOrderDetail[i]; 
           searchEqualOrderNote(linhaNotaEncomenda, tx, i); 
          } 
         } 
        ); 
       } 
       updateOrderNote(value, tx, ite); 
      } else { 
       function createOrderNote(value2, tx, ite) { 
        tx.executeSql('INSERT INTO MobileOrder (IDLocal, MobileOrderID, CompanyID, CustomerID, OrderDate, TotalQtt, TotalCost, UserPHC, HeaderID, OrderState, Observations, Status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [idLocalDestaEncomenda, value2.mobileOrder.mobileOrderID, value2.mobileOrder.companyID, value2.mobileOrder.customerID, value2.mobileOrder.orderDate, value2.mobileOrder.totalQtt, value2.mobileOrder.totalCost, value2.mobileOrder.userPHC, value2.mobileOrder.headerID, value2.mobileOrder.orderState, value2.mobileOrder.observations, value2.mobileOrder.status], 
         function (tx, result) { 
          function searchEqualOrderNote(value3, tx, ite, idLocalInput) { 
           tx.executeSql('SELECT * FROM MobileOrderDetail where MobileOrderDetailID = ?', [value3.mobileOrderDetailID], 
            function (tx, result) { 
             function updateCreateLineOrderNote(tx, result, nResultadosIn, ite, value3) { 
              if (nResultadosIn > 0) { 
               function updateLineOrderNote(value4, tx, ite) { 
                tx.executeSql('UPDATE MobileOrderDetail SET MobileOrderID =?, Ref =?, CompanyID = ?, Discount = ?, Qtt = ?, TotalDetail=?, DetailID=? WHERE MobileOrderDetailID = ?', [value4.mobileOrderID, value4.ref, value4.companyID, value4.discount, value4.qtt, value4.totalDetail, value4.detailID, value4.mobileOrderDetailID], 
                 function (tx, result) {} 
                ); 
               } 
               updateOrderLine(value3, tx, ite); 
              } else { 
               function createLineOrderNote(value4, tx, ite) { 
                tx.executeSql('INSERT INTO MobileOrderDetail (MobileOrderDetailID, MobileOrderID, Ref, CompanyID, Discount, Qtt, TotalDetail, DetailID, IDLocal) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', [value4.mobileOrderDetailID, value4.mobileOrderID, value4.ref, value4.companyID, value4.discount, value4.qtt, value4.totalDetail, value4.detailID, idLocalInput], 
                 function (tx, result) { 
                  //trata linhas de encomenda 
                 }); 
               } 
               createLineOrderNote(value3, tx, ite); 
              } 
             } 
             updateCreateLineOrderNote(tx, result, result.rows.length, ite, value3, idLocalInput); 
            }); 
          } 
          for (var i = 0; i < value2.mobileOrderDetail.length; i++) { 
           orderLine = value2.mobileOrderDetail[i]; 
           searchEqualOrderNote(orderLine, tx, i, idLocalDestaEncomenda); 
          } 
         }); 
       } 
       createOrderNote(value, tx, ite); 
      } 
     } 
     updateCreateOrderNote(tx, result, result.rows.length, ite); 
    }); 

은}

+0

Webkit Developer Tools에서 빌트인 프로파일 러를 사용하거나 수동 솔루션을 작성하여 시간을 절약 할 수 있습니다. 내 눈먼 추측은 당신이 당신의 WHERE 조건에서 사용 된 컬럼에 대한 인덱스를 가지고 있지 않다는 것입니다. (코드가 실제로 배치 된 방법이라면 누구든지 이것을 유지해야 할 것입니다.) – DCoder

+0

이 LOL을 유지해야합니다. 상속 된 코드입니다 : P – Astronaut

답변

0

재사용 트랜잭션, 당신은 성능의 극적인 증가를 볼 수 있어야합니다.

두 가지 방법으로 트랜잭션을 다시 사용할 수 있습니다.

db.transaction에서 여러 tx를 사용하면 병렬 요청을 받게됩니다.

onsuccess 처리기에서 tx를 재사용하면 일련 번호가 요청됩니다.

+0

위의 코드는 동일한 트랜잭션을 다시 사용하고 " 트랜잭션 개체 "주문 직렬 요청에 대한 위의 구현에 문제가 있습니까? 당신이 말하는 개념을 보여줄 수있는 소스가 있습니까? 유일하게 눈에 띄는 것은 테이블에 대한 UPDATES가 INSERTS (느린 10 배)보다 훨씬 느립니다. – Astronaut

+0

재사용을 직렬 요청으로 코딩합니다. 'andleOrderNote (value, root_tx, ite)'에서 root_tx를 재사용함으로써 병렬 처리가 가능할 수도 있습니다. 나는 병렬 요청을 사용함으로써 엄청난 성능 이득을 경험했지만 개인은 클라이언트에 속한다. 그러나이 오픈 소스 라이브러리에서 이러한 병렬 트랜잭션이 어떻게 수행되는지 볼 수 있습니다. https://bitbucket.org/ytkyaw/ydn-db/overview/js/tr 폴더의 js 파일을보십시오. –

+0

코드가 너무 복잡하여 올바르게 제안 할 수 없습니다. 그래서'tx'를 느리게 생각하는 요청의'root_tx'로 변경하십시오. 그러나 변경 한 후에는 더 이상 이전 순서대로 실행되지 않습니다. –