2009-11-27 2 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=' 

를 쿼리 않기 때문에,이 기능을 테스트하는 유닛 테스트를, 그리고 지속적으로 실패 어떤 세션도 반환하지 않습니다. 힘들어도 방금 세션을 DB에 썼습니다.

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 

내가 디버거로이 유닛 테스트를 단계별와 MySQL의 명령 줄에 DB에 보냄을 선택 SQL 과거 복사, 작동 :

내 단위 테스트는이 다음을 수행 좋아, 세션 줄을 되 찾는다.

DB에서 이전 SessionToken을 요청하여 다시 시도했습니다. 이것은 잘 작동합니다. SessionToken을 삽입 한 직후에 SessionToken을 요청하면 실패합니다.

모든 연결은 AutoCommit입니다. 그럼에도 불구하고 트랜잭션 수준을 "Uncommited Read"로 설정하려고했습니다. 이것도 작동하지 않았다.

추가 제안 사항이 있으십니까?

답변

0

해결 : 두 개의 토큰 문자열이 일치하지 않습니다. 그들 중 하나는 마지막에 몇 개의 0 바이트를 가졌습니다. (암호화 및 해독 및 패딩으로 인해 ...) 두 문자열은 시각적으로 동일하지만 MySQL과 Java는 둘 다 언급하지 않았습니다. (그리고 그들은 평소와 같이 어디서나)

1

이것은 일반적으로 삽입과 선택간에 연결이 커밋되지 않아 발생합니다.

기본적으로 다음을 수행 했습니까? 편집

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

내가 커넥터/J 5.1.7와 MySQL을 5.1.30에서 다음 SSCCE을 시도 :

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 모드에서는 이것이 필요하지 않습니다. 또한 데이터가 db에 남아 있으므로 미완료 트랜잭션이 없다고 생각합니다. 확실한 방법이 있습니까? – Mario

+0

또한 AutoCommit을 비활성화하고 명시 적으로 커밋하려고했습니다. 이것은 작동합니다 (즉, commit()이 더 이상 예외를 발생시키지 않음). 그러나 문제를 해결하지는 못합니다. – Mario

+0

이미 vrsion 5.1.10 커넥터가 있습니다. – Mario