2009-11-27 1 views
0

J'utilise une base de données MySQL et un client Java JDBC pour y accéder.Mysql lire les données immédiatement après avoir écrit?

J'ai une table qui contient des informations de session. Chaque session est associée à un SessionToken. Ce jeton est une chaîne codée Base64 d'un hachage de certaines des valeurs de session. Cela devrait être unique. Et est défini comme varchar (50) dans le db.

Lorsque je tente de rechercher une session par son jeton je requête la base de données à l'aide d'une instruction SQL comme ceci:

select SessionId, ClientIP, PersonId, LastAccessTime, SessionCreateTime from InkaSession where SessionToken like 'exK/Xw0imW/qOtN39uw5bddeeMg=' 

J'ai un UnitTest qui teste cette fonctionnalité, et il échoue toujours, parce que la requête ne pas de retour de session, même difficile, je viens d'écrire la session à la DB.

Mon test d'unité effectue les opérations suivantes:

Create Connection via DriverManager.getConnection 
Add a session via Sql Insert query 
close the connection 

create Connection via DriverManager.getConnection 
look for the session via sql select 
unit test fails, because nothing found 

Lorsque je fais un pas dans cette UnitTest avec le débogueur et copie après la sélection sql qui est sur le point d'être envoyé à la DB en une ligne de commande mysql, il fonctionne bien, et je récupère la rangée de la session.

J'ai également essayé de récupérer une session plus ancienne à partir de la base de données en demandant un SessionToken plus ancien. Cela fonctionne bien aussi. Cela échoue seulement si je demande la SessionToken immédiatement après l'avoir insérée.

Toutes les connexions sont sur AutoCommit. Néanmoins, j'ai essayé de définir le niveau de transaction sur "Lire sans engagement". Cela n'a pas fonctionné non plus.

Quelqu'un a-t-il d'autres suggestions?

Répondre

0

Résolu: Les deux chaînes de jetons n'étaient pas identiques. L'un d'entre eux avait un couple de zéro octets à la fin. (En raison du cryptage et du décryptage et du remplissage ...) Les deux chaînes étaient visuellement identiques, mais MySQL et Java ont tous deux dit qu'ils ne l'étaient pas. (Et ils ont raison comme d'habitude)

1

Ceci est généralement dû au fait que la connexion n'est pas validée entre insert et select.

Avez-vous essentiellement fait ce qui suit?

statement.executeUpdate("INSERT INTO session (...) VALUES (...)"); 
connection.commit(); 
resultSet = statement.executeQuery("SELECT ... FROM session WHERE ..."); 

Modifier J'ai essayé le SSCCE suivant sur MySQL 5.1.30 avec connecteur/J 5.1.7:

public static void main(String[] args) throws Exception { 
    Class.forName("com.mysql.jdbc.Driver"); 
    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 
    try { 
     connection = DriverManager.getConnection("jdbc:mysql://localhost/javabase", "root", null); 
     statement = connection.createStatement(); 
     statement.executeUpdate("INSERT INTO foo (foo) VALUES ('foo')"); 
     resultSet = statement.executeQuery("SELECT id FROM foo WHERE foo = 'foo'"); 
     if (resultSet.next()) { 
      System.out.println(resultSet.getLong("id")); 
     } else { 
      System.out.println("Not inserted?"); 
     } 
    } finally { 
     SQLUtil.close(connection, statement, resultSet); 
    } 
} 

fonctionne parfaitement. Peut-être un problème avec votre pilote JDBC. Essayez de mettre à jour. Résolu: Les deux chaînes de jetons n'étaient pas identiques.

+0

Oui, c'est essentiellement ce que j'ai fait. Sauf que, le commit() échouera à cause d'une erreur de syntaxe SQL. Ce que je trouve étrange. Je ferme() la connexion à la place. Quoi qu'il en soit, en mode Autocommit, cela ne devrait pas être nécessaire, n'est-ce pas? En outre, les données restent dans la base de données, donc je ne pense pas qu'il y ait une transaction inachevée. Y a-t-il un moyen d'être sûr? – Mario

+0

Également tenté de désactiver AutoCommit et de valider explicitement. Cela fonctionne (c'est-à-dire que commit() ne déclenche plus d'exception), mais ne résout pas le problème. – Mario

+0

Vous avez déjà vrsion 5.1.10 de Connector. – Mario