1

我正在通过 Matlab 数据库工具箱连接到 MySQL 数据库,以便在 2 个嵌套的 for 循环中一遍又一遍地运行相同的查询。每次迭代后,我都会收到以下警告:

Warning: com.mathworks.toolbox.database.databaseConnect@26960369 is not serializable 
  In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 
Warning: com.mysql.jdbc.Connection@6e544a45 is not serializable 
  In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 
Warning: com.mathworks.toolbox.database.databaseConnect@26960369 not serializable 
  In Import_Matrices_DOandT_julaugsept_inflow_nomettsed at 476 
Warning: com.mysql.jdbc.Connection@6e544a45 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 次重复检查一次。我听说数据库连接对象可能存在内存问题......有没有办法保持我的代码运行?

4

3 回答 3

3

让我们一步一步来。

警告:com.mathworks.toolbox.database.databaseConnect@26960369 不可序列化

这来自这条线

save('inflow.mat');

您正在尝试保存数据库连接。那是行不通的。尝试仅指定您希望保存的变量,它应该会更好。

有一些技巧可以排除这些值,但老实说,我建议你只找到你想要保存的最重要的变量,然后保存它们。但是,如果您愿意,您可以从此页面拼凑出一个解决方案。

save inflow.mat a b c d e
于 2012-12-12T16:08:46.273 回答
1

尝试将查询包装在一个try catch块中。每当您发现错误时,都会重置与应该释放对象的数据库的连接。

nQuery = 100;

while(nQuery>0)
   try
      query_the_database();
      nQuery = nQuery - 1;
   catch
      reset_database_connection();
   end
end
于 2012-12-12T16:07:51.680 回答
0

造成这种情况的最终主要原因是数据库连接对象是 TCP/IP 端口,多个进程无法访问同一个端口。这就是数据库连接对象没有被序列化的原因。端口不能被序列化。

解决方法是在 for 循环中创建一个连接。

于 2015-02-19T15:29:05.597 回答