我创建了一个Database类,它使用静态连接对象,以便在它们自身的实例之间使用。我的问题是这种方法有没有问题?
class Database {
private static Connection connection = null;
public Database() {
if(connection == null){
...
connection = DriverManager.getConnection(...);
...
}
}
}
答案 0 :(得分:3)
如果您每秒钟要进行多次(数百次)查询,那么实现连接池就是您的选择。有关详细信息,请参阅this问题的答案。但是,如果你是一个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());
}
}
}
}
有关此解决方案的一些注意事项:
免责声明上述解决方案并不是一个特别令人惊讶的解决方案。但是,我相信它很容易实现,也是Java新手在进入外部库之前了解绳索的好方法。
答案 1 :(得分:1)
创建对象来管理连接没有任何问题,但是,连接应该打开和关闭,并且可以在多线程环境中使用,因此使用静态连接不是一个好主意。对于需要连接的方法,获取连接使用它,关闭它。即使您没有在多线程环境中使用它,连接也可能会超时,那么您需要不断检查连接是否已启动并且可用,而不是仅仅说,让我连接,使用连接,关闭它