如果您每秒要进行许多(数百个)查询,那么实现连接池是可行的方法。有关更多详细信息,请参阅此问题的答案。但是,如果您是 Java 新手(我们都曾有过一天!),那么我认为您不会需要这个要求,并且可能很难实现它。
相反,如果需要,创建新连接,然后在完成后关闭它的简单模式将是您前进的最佳方式。以下是您的Database
课程的修改版本,我认为这是前进的好方法。
class Database {
private Connection con = null;
private final String connectionString;
public Database(String connectionString) {
this.connectionString = connectionString;
}
public void connect() throws SQLException {
if (con != null // if the connection exists
&& !con.isClosed() // and has not been closed
&& con.isValid(0)) { // and appears to be functioning (with a test timeout of 0ms)
return; // skip connection creation
}
// create the connection
con = DriverManager.getConnection(connectionString);
}
public void testFunction() {
try {
connect();
// .. do some stuff with the connection ..
} catch (Exception e) {
// log or otherwise deal with the error
} finally {
try {
con.close();
} catch (Exception e) {
System.err.println("Failed to close connection: " + e.toString());
}
}
}
}
关于此解决方案的一些注意事项:
- 这不是很有效 - 创建新连接总是比使用现有连接花费更多时间
- 此类如果不是线程安全的 - 如果您需要此要求,我建议使用线程池。但是,如果您为每个线程创建一个此类的新实例,那么它将是线程安全的(因为无需担心静态连接!)
- 它确实可以完成工作 - 当然对于简单的情况。我将该模型用于容量相对较小的数据库,该数据库每分钟建立/关闭大约 50-100 个连接,并且不会增加明显的延迟
- 它非常健壮——没有什么比每次查询打开和关闭连接更安全的了。保证您能够处理每个查询的连接失败,并且连接将始终关闭(除非它已经关闭)。
免责声明上述解决方案并不是一个特别令人惊奇的解决方案。但是,我相信它实现起来很简单,也是 Java 新手在进入外部库之前了解其中的原理的好方法。