2012-12-12 34 views
1

我通過Matlab數據庫工具箱連接到MySQL數據庫,以便在2個嵌套for循環內一遍又一遍地運行相同的查詢。每次迭代後,我得到這樣的警告:Matlab數據庫工具箱 - 警告:[email protected]不可序列化

Warning: [email protected] is not serializable 
    In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 
Warning: [email protected] is not serializable 
    In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 
Warning: [email protected] not serializable 
    In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 
Warning: [email protected] is not serializable 
    In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 

我的代碼基本結構是這樣的:

%Server 
host = 
user = 
password = 
dbName = 

%# JDBC parameters 
jdbcString = sprintf('jdbc:mysql://%s/%s', host, dbName); 
jdbcDriver = 'com.mysql.jdbc.Driver'; 

%# Create the database connection object 
conn = database(dbName, user , password, jdbcDriver, jdbcString); 
setdbprefs('DataReturnFormat', 'numeric'); 

%Loop 
for SegmentNum=3:41; 
    for tl=1:15; 
    tic; 
    sqlquery=['giant string']; 
    results = fetch(conn, sqlquery); 
    (some code here that saves the results into a few variables) 

    save('inflow.mat'); 
    end 
end 

time = toc 

close(conn); 
clear conn 

最後,一些迭代後的代碼將與此錯誤崩潰:

Error using database/fetch (line 37) 
    Query execution was interrupted 

Error in Import_Matrices_DOandT_julaugsept_inflow_nomettsed (line 
466) 
results = fetch(conn, sqlquery); 

昨晚在25次迭代後出現錯誤。我總共需要做大約600次迭代,並且我不希望每25次都檢查一次。我聽說數據庫連接對象可能存在內存問題......有沒有辦法保留我的代碼運行?

+0

是否有更多最後提供的錯誤陳述? – PearsonArtPhoto

+0

是的,我不記得保存它,但它在fetch()命令上出錯。 – Amy

+0

如果你可以再次運行它,併發布整個錯誤,這將有相當大的幫助。 – PearsonArtPhoto

回答

1

嘗試將查詢包裝在trycatch塊中。每當你發現一個錯誤,重置連接到數據庫應該釋放對象。

nQuery = 100; 

while(nQuery>0) 
    try 
     query_the_database(); 
     nQuery = nQuery - 1; 
    catch 
     reset_database_connection(); 
    end 
end 
+0

我從來沒有使用'try catch',所以這可能是一個愚蠢的問題,但爲什麼我需要while語句?我可以不把'try catch end'部分放在嵌套for循環中嗎? – Amy

+0

是的,你可以。 – PearsonArtPhoto

3

讓我們一步一個腳印吧。

Warning: [email protected] is not serializable

這來源於此行

save('inflow.mat'); 

您試圖保存數據庫連接。這是行不通的。嘗試指定您只想保存的變量,它應該更好。

有幾個技巧來排除值,但老實說,我建議你找到你想保存的最重要變量,並保存這些值。但是如果你願意的話,你可以拼湊一個來自this page的解決方案。

save inflow.mat a b c d e 
+0

有道理。我想將所有變量保存在工作區中...是否有一種方法可以指定節省所有變量而不是連接? – Amy

+1

每次迭代都會增加額外的變量,所以我無法手動指定要保存哪些變量。我想我可以使用'-regexp'來保存我想要的內容,因爲所有變量名都以相同的字符開頭,並且會排除連接。 – Amy

0

最終的主要原因是數據庫連接對象是TCP/IP端口,多個進程無法訪問同一個端口。這就是數據庫連接對象未被序列化的原因。端口不能被序列化。

解決方法是在for循環中創建一個連接。

相關問題