我创建了一个数据库类,它使用静态连接对象以便在其自身实例之间通用。我的问题是这种方法是否有任何问题?
class Database {
private static Connection connection = null;
public Database() {
if(connection == null){
...
connection = DriverManager.getConnection(...);
...
}
}
}
最佳答案
如果您每秒要处理很多(数百)个查询,那么实现连接池是可行的方法。查看 this 的答案问题了解更多详情。但是,如果您是 Java 新手(我们都曾是 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 新手在使用外部库之前了解基本情况的好方法。
关于java - 在其他对象之间共享 JDBC Connection 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16613629/