9
votes

puis-je utiliser la même connexion JDBC, la même déclaration et les résultatsset pour exécuter deux questions dans JDBC

Je suis authentifiant utilisateur comme xxx pré>

Je ferme la connexion dans dataManager.putconnection (connexion) code>. Je veux demander une fois que l'utilisateur est connecté, puis je dois mettre à jour l'état de l'utilisateur et entretenir l'historique des journaux. Puis-je utiliser quelque chose comme celui-ci p>

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


0 commentaires

4 Réponses :


2
votes

Je suggérerais de réutiliser la connexion en raison de l'établissement de la connexion à chaque fois que vous essayez d'interroger votre base de données peut-être une surcharge de performance.

comme pour les déclarations, je suggérerais de passer à la statualité préparée. Ils sont non seulement mis en cache mais un bon moyen de vous protéger des injections SQL. Donc, accumulez votre requête avant la main, les exécuter et enfin les fermez lorsque vous avez terminé. La réutilisation préparée signifie que vous remplacez les valeurs de paramètre pour la même staturement préparée et exécutant la même chose. P>

Donc, par exemple, si vous avez une estabilité préparée comme: P>

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


6 commentaires

Vous voulez dire que je peux fermer la déclaration et les Resultset. Je veux dire qu'une fois que je ferme la déclaration et les Resultats, utilisez la mise à jour et une autre requête de la même manière, puis fermez la connexion de base de données dataManager.putconnection (connexion); . Est-ce?


@Basit: Mise à jour de ma réponse pour inclure plus d'informations. Idéalement, vous voudrez réutiliser votre objet Connection . Les Resultset n'ont pas de sens et comme je l'ai spécifié, je suggérerais de passer de Déclaration à PrepareStatement


Comme lorsque je crée une déclaration instruction S = Connection.Createstatement (); alors je dois le fermer. Dois-je aussi fermer la statu quai de la même manière que je fais avec la déclaration? Je suis d'abord créé une déclaration à l'aide de la connexion, puis obtenez résultatsset à l'aide de S.executequery (Query) , puis en boucle via le jeu de résultats. Comment puis-je le remplacer par PrepareStatement?


@Basit: Oui Vous devez fermer votre PrepareStatement après avoir terminé de travailler avec elle. Vous pouvez en savoir plus sur la façon de l'utiliser dans le Javadoc


J'ai édité mon code. Pouvez-vous s'il vous plaît vérifier si je l'ai fait de la bonne manière?


@Basit: Vous ne construisez pas correctement votre statut préparé. Le SQL doit être paramétré avec? Pour les valeurs attendues, comme je l'ai fait dans mon exemple. Voici un didacticiel qui peut aider: "Utilisation de déclarations préparées"



-1
votes

5
votes

puis-je utiliser la même connexion JDBC, déclaration

Oui. Vous pouvez les réutiliser avant la fermeture.

et Resultatset

non. La question n'a pas de sens. L'ensemble de résultats est le résultat de l'exécution d'une requête ou d'une mise à jour. Il n'y a pas de question de la réutilisation. J'imagine que vous devez fermer le résultat précédent défini avant d'exécuter la requête suivante ou la mise à jour.


1 commentaires

Il semble bien, mais vous ne réutilisez aucune déclaration ou préparé de la base là, pas que vous avez apparemment besoin de.



1
votes

a répondu à un cas de test différent avec la même question.

Puis-je utiliser la même connexion JDBC, la même déclaration et les résultats pour exécuter deux requêtes dans JDBC

Nous ne pouvons pas réutiliser la connexion, la déclaration et les résultatsset parallèles ou simultanés comme suit: xxx

  • Fermeture d'un Connexion Ferme A instruction , lorsque instruction fermé se ferme implicitement RESUNTREST .
  • Fermeture d'un Déclaration ferme A ResulatsSet mais pas Connection.
  • Fermeture d'un REULTset se ferme uniquement, pas instruction .
  • Par défaut, un seul Resultats (code> par instruction peut être ouvert en même temps.

    Meilleure pratique:

    • Les connexions ne sont pas du thread en toute sécurité, alors les partager sur des demandes n'est pas une bonne idée.
    • Ouverture d'une connexion de DB est un coûteux, doit utiliser un ConnectionPool pour partager des connexions.
    • Fermer RESUNTSET Dès que vous avez terminé de fonctionner avec RESUNTSET .

1 commentaires

Je ne comprends pas ce que votre code est censé prouver ou vivre ici.