我正在验证用户身份
public static boolean login(DataManager dataManager, String userName, String password) {
boolean authenticated = false;
Connection connection = dataManager.getConnection();
if (connection != null) {
try {
Statement s = connection.createStatement();
String sql = "query";
try {
ResultSet rs = s.executeQuery(sql);
try {
while (rs.next()) {
String group_code = rs.getString(1);
String orgaunit = rs.getString(2);
authenticated = true;
} //end of while()
} finally {
rs.close();
}
} finally {
s.close();
}
} catch(SQLException e) {
//System.out.println("Could not login from dataabse:" + e.getMessage());
} finally {
dataManager.putConnection(connection);
}
} //end of if (connection != null)
return authenticated;
} //end of login()
我正在
dataManager.putConnection(connection)
关闭连接。我想问,一旦用户登录,我就必须更新用户的状态并维护日志历史记录。我可以用这样的东西吗
try {
Statement s = connection.createStatement();
String sql = "query";
try {
ResultSet rs = s.executeQuery(sql);
try {
while (rs.next()) {
String group_code = rs.getString(1);
authenticated = true;
} //end of while()
if (autherntcated == true) {
sql = "query2(update status)";
rs = s.executeQuery(sql);
while (rs.next()) {
//dos tuff
}
sql = "anotherQuery";
rs = s.executeQuery(sql);
while (rs.next()) {
//do stuff
}
}
} finally {
rs.close();
}
} finally {
s.close();
}
} catch(SQLException e) {
//System.out.println("Could not login from dataabse:" + e.getMessage());
} finally {
dataManager.putConnection(connection);
}
意味着使用相同的连接、相同的语句和相同的结果集执行其他查询还是错误的方法?
谢谢你。
编辑 -------------------------------------------------- ------------
if (connection != null) {
try {
String sql = "query";
PreparedStatement prepStatement = connection.prepareStatement(sql);
try {
ResultSet rs = prepStatement.executeQuery(sql);
try {
while (rs.next()) {
String group_code = rs.getString(1);
authenticated = true;
} //end of while()
} finally {
rs.close();
}
} finally {
prepStatement.close();
}
/// Addition
if (authenticated == true) {
updateUser(connection, userName);
}
} catch(SQLException e) {
//System.out.println("Could not login from dataabse:" + e.getMessage());
} finally {
dataManager.putConnection(connection);
}
} //end of if (connection != null)
更新方法:
private static void updateUser(Connection connection, String userName) {
try {
String sql = "UPDATE users SET status_code = 'A' WHERE login_id = '" + userName + "'";
PreparedStatement prepStatement = connection.prepareStatement(sql);
try {
int numberOfRowsUpdated = prepStatement.executeUpdate(sql);
} finally {
prepStatement.close();
}
maintainHistory(connection);
} catch(SQLException e) {
//System.out.println("Could not login from dataabse:" + e.getMessage());
}
} //end of updateUser()
维护历史:
private static void maintainHistory(Connection connection) {
try {
String sql = "INSERT INTO auditlog_user_logins(user_code,logintime,prstid) VALUES ();";
PreparedStatement prepStatement = connection.prepareStatement(sql);
try {
int numberOfRowsUpdated = prepStatement.executeUpdate(sql);
} finally {
prepStatement.close();
}
} catch(SQLException e) {
//System.out.println("Could not login from dataabse:" + e.getMessage());
}
} //end of maintainHistory()
我可以使用相同的 JDBC 连接、语句吗
是的。您可以在关闭之前重复使用它们。
和结果集
不。这个问题没有意义。结果集是执行查询或更新的结果。不存在重复使用的问题。我想您需要在执行下一个查询或更新之前关闭前面的结果集。
我建议重用连接,因为每次尝试查询数据库时都建立连接可能会产生性能开销。
对于语句,我建议改用PreparedStatement。它们不仅被缓存,而且是保护自己免受 SQL 注入的一种好方法。因此,请预先构建查询,执行它们,最后在完成后关闭它们。重用PreparedStatement意味着您用相同的PreparedStatement替换参数值并执行相同的操作。
例如,如果您有一个像这样的PreparedStatement:
PreparedStatement preparedStatement = connection.prepareStatement("SELECT [col_names] from [table_name] where [col_1_value] = ? and [col_2_value] = ?")
在这种情况下,您只需用新值替换参数即可多次重用相同的PreparedStatement。一般来说,对于您的情况,您将有多个PreparedStatements。由于这些语句被缓存,因此当您执行相同的语句时,它们不会对性能造成太大影响。
这里有一个很好的教程来向您介绍PreparedStatement,以防您需要:“使用准备好的语句”
ResultSets - 好吧,我不知道如何重用它。使用完后将其关闭。根据 Javadoc:
Statement 对象时 ResultSet 对象会自动关闭 生成它的被关闭、重新执行或用于检索下一个 由多个结果序列产生的结果。
但是,使用完毕后请务必关闭连接。可重用性是一件好事,但资源管理不善则不然
用相同的问题回答不同的测试用例。
我可以使用相同的 JDBC 连接、Statement 和 ResultSet 在 JDBC 中执行两个查询吗
我们可以重用 JDBC 连接,并且在某种程度上重用 Statement 对象来执行多个查询,因此必须小心处理资源以避免意外行为或资源泄漏。避免为不同的查询重复使用 ResultSet 对象,因为这可能会导致错误和数据不一致。
Connection
会关闭 Statement
,当 Statement
关闭时也会隐式关闭 ResultSet
。Statement
会关闭 ResultSet
,但不会关闭连接。ReultSet
只会关闭自身,而不是 Statement
。ResultSet
只能同时打开一个Statement
。最佳实践:
ResultSet
完成工作后,立即关闭 ResultSet
。您可以使用UpdatableResultSet。