【问题标题】:Shall I close Result Set before creating a new one?我应该在创建新结果集之前关闭结果集吗?
【发布时间】:2013-10-20 10:17:23
【问题描述】:

我必须在 Titanium Mobile 中关闭结果集,然后再创建一个新结果集,还是在没有引用它时它会自动“关闭”?

例如,这样的东西是否安全且无内存泄漏?

var db = db.open("db_name");
var rs = db.execute("SELECT * FROM table");

while(rs.isValidRow()){ /* working with the resuls... */ }

// I make another select before closing the previous (current) results set
rs = db.execute("SELECT * FROM another_table");

while(rs.isValidRow()){ /* working with the results... */ }

// Once I am completely done I close the RS and DB
rs.close();
db.close();

或者每次需要新选择时我都必须关闭结果集。

var db = db.open("db_name");
var rs = db.execute("SELECT * FROM table");

while(rs.isValidRow()){ /* working with the resuls... */ }

// Close RS and then initialize a new one
rs.close();
rs = db.execute("SELECT * FROM another_table");

while(rs.isValidRow()){ /* working with the resuls... */ }

rs.close();
db.close();

【问题讨论】:

    标签: database titanium resultset


    【解决方案1】:

    您应该在检索到所有必要的数据后立即关闭 ResultSet。覆盖指向 ResultSet 的变量不会关闭它,因此您的第二个示例更合适。

    顺便说一句。你声明 rs 两次,所以应该是:

    var db = db.open("...");
    var rs = db.execute("SELECT * FROM table");
    
    // while(rs.isValidRow()){ ... }
    
    rs.close();
    
    rs = db.execute("SELECT * FROM another_table"); // Another select
    
    // while(rs.isValidRow()){ ... }
    
    
    rs.close();
    db.close();
    

    或者更好地避免代码中发生的任何混淆:

    var db = db.open("...");
    var rs1 = db.execute("SELECT * FROM table");
    var rs2 = db.execute("SELECT * FROM another_table");
    
    // while(rs1.isValidRow()){ ... }
    
    rs1.close();
    
    // while(rs2.isValidRow()){ ... }
    
    rs2.close();
    
    db.close();
    

    编辑:阅读Best practises for SQLite,了解更多关于如何创建、执行和关闭数据库操作的详细信息。

    【讨论】:

    • 谢谢,这个怎么样,可以吗? var db = db.open("..."), someName = db.execute("SELECT column FROM table WHERE id = 1").field(0); // Select only one item db.close();
    • 通过调用db.execute(),您仍然可以创建占用内存空间的资源,直到调用.close()。不将资源分配给变量在这里无济于事。我也不明白你想要达到什么目的。如果在每个查询之后编写 open() 和 close() 会打扰您创建一些接受查询作为参数的好函数。
    【解决方案2】:

    根据文档http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Database.ResultSet

    在iOS平台上,关闭数据库的同时也关闭了结果集,即只有当前打开了数据库才能访问结果集

    这也可以在iphone/Classes/TiDatabaseProxy.msee on Github)的Titanium Mobile(iOS)源代码中找到

    通过查看源代码(同一个文件),我们可以看到TiDatabaseProxy 创建了一个数组,用于存储结果集,然后用于关闭所有结果集。 (see on Github)

    然而,Android 看起来工作方式不同,而且平台很少,因此出于这个原因(以及“最干净”的代码),最好在其他情况下初始化新的结果集之前关闭结果集资源(在不同的平台)可能不会被释放,这会造成内存泄漏。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2011-11-21
      • 1970-01-01
      • 2011-01-31
      • 2013-01-03
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多