2013-03-14 83 views
1

我目前正在從我的iPhone導入一個巨大的CSV文件到rails服務器。在這種情況下,服務器將解析數據,然後開始將數據行插入到數據庫中。 CSV文件相當大,操作結束需要很長時間。mysql龐大的操作

由於我是異步執行此操作,因此我的iPhone可以轉到其他視圖並執行其他操作。

但是,當它在另一個表中請求另一個查詢時,這將HANG,因爲第一個操作仍在嘗試將CS​​V的信息插入到數據庫中。

有沒有辦法解決這類問題?

+0

您使用的是什麼引擎?你需要像InnoDB這樣的引擎,它具有記錄級鎖定而不是表級鎖定。 – Barmar 2013-03-14 00:34:09

+0

我正在使用mysql數據庫...不知道你是什麼意思的引擎。 – freedom 2013-03-14 00:35:17

+0

這不是一個引擎,那是一個數據庫。 MySQL有許多不同的引擎可以爲每個表選擇:InnoDB,MyISAM等。它們以不同方式存儲數據,並具有不同的鎖定機制和性能特徵。 – Barmar 2013-03-14 00:46:43

回答

1

只要手機不關心數據庫插入完成時,您可能想嘗試將CS​​V文件存儲在服務器上的tmp目錄中,然後將腳本從該文件寫入數據庫。或者只是將它存儲在內存中。這樣,一旦手機發布了CSV文件,當腳本異步處理數據庫插入時,它可以繼續進行其他操作。是的,@Barmar正確地使用InnoDB引擎而不是MyISAM(在某些配置中可能是默認的)。

或者,您可能需要考慮啓用「低優先級更新」,這將延遲寫入調用,直到所有掛起的讀取調用完成。有關MySQL表鎖定的信息,請參見this article。 (我不確定你說的究竟是什麼掛起:更新,或執行更新時讀取...)

無論如何,如果你是從你的手機異步發佈數據(即不是從UI線程),只要您不嘗試使用超過併發HTTP連接的最大數量,就不應該成爲問題。

+0

手機不應該關心數據庫插入,因爲它正在向服務器運行異步HTTP請求。 我有興趣使用腳本來異步處理數據庫插入。將CSV文件上載到數據庫並使用腳本來解釋文件夾中是否收到新文件。 是否允許單個用戶連接到數據庫的多個實例,以允許與數據庫的多個連接,或者我必須使用不同的用戶名連接到數據庫以允許與數據庫的多個連接? – freedom 2013-03-19 16:27:14

+0

我的意思是掛起是第一個事務正在進行,而下一個請求的查詢正在等待第一個事務完成,然後它會處理。 – freedom 2013-03-19 16:42:21

+0

用戶可以有多個連接。您甚至可以管理允許同時連接的數量。看看[這個頁面](http://dev.mysql.com/doc/refman/5。0/en/user-resources.html)在MySQL文檔中。 – enjayem 2013-03-20 00:11:44