我目前正在将一个巨大的 CSV 文件从我的 iPhone 导入到 rails 服务器。在这种情况下,服务器将解析数据,然后开始将数据行插入数据库。CSV 文件相当大,操作结束需要很长时间。
由于我是异步执行此操作,因此我的 iPhone 可以转到其他视图并执行其他操作。
但是,当它在另一个表中请求另一个查询时.. 这将挂起,因为第一个操作仍在尝试将 CSV 的信息插入数据库。
有没有办法解决这类问题?
我目前正在将一个巨大的 CSV 文件从我的 iPhone 导入到 rails 服务器。在这种情况下,服务器将解析数据,然后开始将数据行插入数据库。CSV 文件相当大,操作结束需要很长时间。
由于我是异步执行此操作,因此我的 iPhone 可以转到其他视图并执行其他操作。
但是,当它在另一个表中请求另一个查询时.. 这将挂起,因为第一个操作仍在尝试将 CSV 的信息插入数据库。
有没有办法解决这类问题?
只要手机不关心数据库插入何时完成,您可能希望尝试将 CSV 文件存储在服务器上的 tmp 目录中,然后将脚本从该文件写入数据库。或者只是将其存储在内存中。这样,一旦手机发布了 CSV 文件,它就可以在脚本异步处理数据库插入时继续做其他事情。是的,@Barmar 关于使用 InnoDB 引擎而不是 MyISAM(在某些配置中可能是默认设置)是正确的。
或者,您可能需要考虑启用“低优先级更新”,这将延迟写入调用,直到所有挂起的读取调用完成。请参阅这篇关于 MySQL 表锁定的文章。(我不确定你说的到底是什么挂起:更新,或者在执行更新时读取......)
无论如何,如果您从手机异步发布数据(即,不是从 UI 线程),只要您不尝试使用超过最大并发 HTTP 连接数,这应该不是问题。