2012-07-15 155 views
0

我正在使用JDBC准备语句更新远程数据库。 当我执行相同的代码来更新本地数据库时,它需要几毫秒,但对于远程数据库,它需要900个行左右的时间太长。 组合的所有行的大小为160 KB。 远程主机是Hostgator,表的数据库引擎是InnoDB。通过JDBC更新远程数据库需要很长时间

这里是我的代码:

String insertTableSQL = "INSERT INTO abc(zzz,c,d,e,timestamp) VALUES (?,?,?,?,?)"; 

String delSt = "DELETE FROM abc WHERE zzz= ?"; 

del = connection.prepareStatement(delSt); 
preparedStatement = connection.prepareStatement(insertTableSQL); 
connection.setAutoCommit(false); 
Iterator<DataObject> itr = updationList.iterator(); 
while (itr.hasNext()) { 
    DataObject dO = itr.next(); 
    del.setString(1, dO.a + ":" + dO.b); 
    for (SubObject sO : dO.getsO.values()) { 
     try { 
      preparedStatement.setString(1, sO.a + ":" + sO.b); 
      preparedStatement.setString(2, sO.c); 
      preparedStatement.setInt(3, sO.d); 
      preparedStatement.setFloat(4, sO.e); 
      preparedStatement.setTimestamp(5, getCurrentTimeStamp()); 
      preparedStatement.addBatch(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
try { 
    del.execute(); 
    preparedStatement.executeBatch(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
try { 
    connection.commit(); 
} 
... 

回答

1

您应检查指标都是一样的在您的本地表和远程服务器上。删除可能是罪魁祸首,EXPLAIN SELECT * FROM abc WHERE zzz=?会告诉你那里发生了什么。通过将useCompression=true添加到您的JDBC连接字符串中,您可以尝试向连接添加压缩。这会将160k缩小一点点,并发送命令。

http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html

+0

我试图与另一台。时间取200行是441ms准备清单,79671ms执行列表,390ms提交。 在上面的许多行(900)的情况下,它不插入任何东西。 数据库结构相同,因为我在远程数据库中导入了相同的表。 问题可以与主机? – User1234 2012-07-15 18:41:35

+0

我认为你有大约400毫秒的网络延迟,这是杀死性能。添加'rewriteBatchedStatements = true'以使批次正常工作。如果你在“zzz”上有一个唯一的(或主要)索引,你可以使用'INSERT ... ON DUPLICATE KEY UPDATE ...'重写DELETE/INSERT语句。如果你没有合适的索引,你也可以'从abc WEHRE zzz IN(?,?,?,...)中删除'。 – 2012-07-15 21:36:31

+0

是延迟很高。任何其他方式我可以更快地更新。 我有很好的上传速度。 – User1234 2012-07-16 05:10:04