我知道有类似的问题已被问到但仍然试图了解它。 我正在追逐数据库连接未关闭的错误。简化为:
class Database {
private Connection connection;
Database () {
connection = connectToDatabase ();
}
boolean isConnected () { return connection != null; }
void disconnect () {
if (connection != null)
connection.close ();
}
void accessDb () { doSomethingWithDb (); }
}
class Foo
{
private Database db;
foo (Database d) {
db = d;
}
void doFoo () {
if (db.isConnected ())
db.accessDb ();
}
}
class Core
{
Database db;
private Foo foo;
Core () {
db = new Database;
foo = new Foo (db);
}
void serve (String someClientRequest) {
try {
foo.doFoo ();
if (db.isConnected ())
db.accessDb ();
} catch (SQLException ignore) {
}
finally {
db.disconnect ();
}
}
}
class Servlet
{
Servlet () {}
void post (String someClientRequest) {
Core core = new Core ();
core.serve (someClientRequest);
}
}
也许servlet可以在完成后调用core.db.disconnect()(好吧......可以吗?),但实际的实现更复杂。 所以问题是:Foo会创建一个新的数据库连接吗?来自C ++,我仍然觉得令人困惑的是,对象被称为“引用”,而事实上它们似乎是通过值传递/接受的......? 对不起,如果已经涵盖了这个问题,我发现了几个关于这个主题的回答,但没有一个能让我明白为什么那个愚蠢的db拒绝关闭。谢谢!