2009-11-27 62 views
0

我正在使用MySQL DB和Java JDBC客戶端來訪問它。Mysql在寫入後立即讀取數據?

我有一個包含會話信息的表。每個會話都與一個SessionToken相關聯。該令牌是某些會話值的散列的Base64編碼的字符串。它應該是獨一無二的。並且在db中定義爲varchar(50)。

當我試圖通過它的令牌來查找一個會議上,我查詢使用SQL語句是這樣的數據庫:

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

我有一個單元測試,測試這個功能,它始終失敗,因爲查詢不不返回任何會議,甚至是艱難的,我剛剛寫了會議的數據庫。

我的單元測試包括以下內容:

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 

當我通過這個單元測試步驟與調試器和複製過去的選擇SQL是將要發送到數據庫到MySQL命令行,它的工作原理很好,我得到了會議排。

我也嘗試通過請求一個較舊的SessionToken來從數據庫中檢索較舊的會話。這工作也很好。它只會失敗,如果我插入它後立即要求SessionToken。

所有連接都在AutoCommit上。儘管如此,我試圖將交易級別設置爲「未讀取」。這也沒有用。

有沒有人有任何進一步的建議?

回答

0

解決:兩個令牌字符串不相同。其中一個在最後有幾個零字節。 (由於加密和解密以及填充...)這兩個字符串在視覺上完全相同,但MySQL和Java都表示,它們不在哪裏。 (和他們一樣正常)

1

這通常是由插入和選擇之間未提交的連接引起的。

你基本上做了以下幾點嗎?

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

編輯我試着在MySQL 5.1.30以下SSCCE用連接器/ 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); 
    } 
} 

完美的作品。也許你的JDBC驅動程序存在問題。嘗試升級。

+0

是的,那基本上是我所做的。除此之外,由於SQL語法錯誤,commit()將失敗。我覺得很奇怪。我關閉()連接。無論如何,在Autocommit模式下,這不應該是必要的,應該嗎?此外,數據保留在分貝,所以我不認爲有任何未完成的交易。有什麼方法可以肯定嗎? – Mario 2009-11-27 12:00:49

+0

還試圖禁用AutoCommit並顯式提交。這樣做(即commit()不再引發異常),但不能解決問題。 – Mario 2009-11-27 12:06:25

+0

連接器已經有vrsion 5.1.10。 – Mario 2009-11-27 12:43:07

相關問題