通过JDBC更新远程DB需要很长时间

时间:2012-07-15 16:44:23

标签: java mysql jdbc prepared-statement bulkinsert

我正在通过JDBC Prepared语句更新远程数据库。 当我执行相同的代码来更新本地数据库时,它需要几毫秒,但对于远程数据库,它需要花费太长时间来处理大约900行。 所有行的大小为160 KB。 远程主机是Hostgator,表的数据库引擎是InnoDB。

这是我的代码:

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 个答案:

答案 0 :(得分:0)

您应该检查本地表和远程服务器上的索引是否相同。删除可能是罪魁祸首,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