9

私はユーザーを認証しています

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()
4

4 に答える 4

5

同じJDBC接続、ステートメントを使用できますか

はい。閉じる前にそれらを再利用できます。

および結果セット

いいえ。質問は意味がありません。結果セットは、クエリまたは更新を実行した結果です。それを再利用することに疑問の余地はありません。次のクエリまたは更新を実行する前に、前の結果セットを閉じる必要があると思います。

于 2012-09-28T07:35:07.353 に答える
2

データベースにクエリを実行しようとするたびに接続を確立すると、パフォーマンスのオーバーヘッドが発生する可能性があるため、接続を再利用することをお勧めします。

ステートメントについては、PreparedStatement に切り替えることをお勧めします。それらはキャッシュされるだけでなく、SQL インジェクションから身を守る 1 つの良い方法です。そのため、事前にクエリを作成して実行し、完了したら最後に閉じます。PreparedStatement を再利用するということは、同じ PreparedStatement のパラメーター値を置き換えて、同じものを実行していることを意味します。

たとえば、次のような PreparedStatement があるとします。

PreparedStatement preparedStatement = connection.prepareStatement("SELECT [col_names] from [table_name] where [col_1_value] = ? and [col_2_value] = ?")

この場合、パラメーターを新しい値に置き換えるだけで、同じPreparedStatementを複数回再利用できます。通常、あなたの場合、複数の PreparedStatements があります。これらのステートメントはキャッシュされるため、同じものを実行してもパフォーマンスに大きな影響はありません。

PreparedStatement が必要な場合に備えて、PreparedStatement を紹介する良いチュートリアルを次に示します。「Prepared Statements の使用」

ResultSets - どうやって再利用できるのかわかりません。それらを使い終わったら、閉じてください。Javadocに従って:

ResultSet オブジェクトは、それを生成した Statement オブジェクトが閉じられるか、再実行されるか、複数の結果のシーケンスから次の結果を取得するために使用されると、自動的に閉じられます。

ただし、使用が終了したら、必ず接続を閉じてください。再利用性は良いことですが、リソースの不適切な管理はそうではありません

于 2012-09-28T05:56:52.750 に答える
-1

UpdatableResultSetを使用できます。

于 2012-09-28T06:41:59.783 に答える