我可以使用相同的 JDBC 连接、语句和结果集在 JDBC 中执行两个查询吗

问题描述 投票:0回答:4

我正在验证用户身份

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()
java jdbc
4个回答
5
投票

我可以使用相同的 JDBC 连接、语句吗

是的。您可以在关闭之前重复使用它们。

和结果集

不。这个问题没有意义。结果集是执行查询或更新的结果。不存在重复使用的问题。我想您需要在执行下一个查询或更新之前关闭前面的结果集。


2
投票

我建议重用连接,因为每次尝试查询数据库时都建立连接可能会产生性能开销。

对于语句,我建议改用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 对象会自动关闭 生成它的被关闭、重新执行或用于检索下一个 由多个结果序列产生的结果。

但是,使用完毕后请务必关闭连接。可重用性是一件好事,但资源管理不善则不然


1
投票

用相同的问题回答不同的测试用例。

我可以使用相同的 JDBC 连接、Statement 和 ResultSet 在 JDBC 中执行两个查询吗

我们可以重用 JDBC 连接,并且在某种程度上重用 Statement 对象来执行多个查询,因此必须小心处理资源以避免意外行为或资源泄漏。避免为不同的查询重复使用 ResultSet 对象,因为这可能会导致错误和数据不一致。

  • 关闭
    Connection
    会关闭
    Statement
    ,当
    Statement
    关闭时也会隐式关闭
    ResultSet
  • 关闭
    Statement
    会关闭
    ResultSet
    ,但不会关闭连接。
  • 关闭
    ReultSet
    只会关闭自身,而不是
    Statement
  • 默认情况下,每个
    ResultSet
    只能同时打开一个
    Statement

最佳实践:

  • 连接不是线程安全的,因此跨请求共享它们不是一个好主意。
  • 打开数据库连接是昂贵的,应该使用连接池来共享连接。
  • 使用
    ResultSet
    完成工作后,立即关闭
    ResultSet

-1
投票

您可以使用UpdatableResultSet

© www.soinside.com 2019 - 2024. All rights reserved.