2009-11-27 4 views
0

Я использую MySQL DB и клиент JDBC Java для доступа к нему.Mysql прочитал данные сразу после написания?

У меня есть таблица, которая содержит информацию о сеансе. Каждый сеанс связан с SessionToken. Этот токен является строкой, закодированной в Base64 для хэша некоторых значений сеанса. Он должен быть уникальным. И определяется как varchar (50) в db.

Когда я пытаюсь для поиска сеанса его маркером я запрос к базе данных, используя SQL заявление, как это:

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

У меня есть UnitTest, который проверяет эту функциональность, и это не подействует, так как запрос делает не возвращать сессию, даже жестко, я только что написал сессию в БД.

Мой тестовый блок выполняет следующие функции:

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 

Когда я пошагово этого UnitTest с отладчиком и скопировать мимо выбора SQL, который собирается быть отправлен в БД в командной MySQL строки, она работает отлично, и я возвращаю сессию.

Я также попытался извлечь более старую сессию из db, попросив более старую сессию SessionToken. Это прекрасно работает. Это только терпит неудачу, если я попрошу SessionToken сразу после того, как я вставил его.

Все соединения находятся на AutoCommit. Тем не менее я попытался установить уровень транзакции на «Read Uncommited». Это тоже не сработало.

Есть ли какие-либо дополнительные предложения?

ответ

0

Решено: две точечные строки, где не идентичны. Один из них имел пару байтов Zero в конце. (Из-за шифрования и дешифрования и заполнения ...) Две строки, где визуально идентичны, но MySQL и Java говорят, что они там нет. (И они, где, как обычно)

1

Это обычно связано с тем, что соединение не выполняется между вставкой и выбором.

Вы в основном делаете следующее?

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

Редактировать Я попытался следующий SSCCE на MySQL 5.1.30 с Connector/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

Да, это в основном то, что я сделал. Кроме того, commit() завершится ошибкой из-за ошибки синтаксиса SQL. Что я нахожу странным. Вместо этого я закрываю() соединение. Во всяком случае, в режиме Autocommit это не обязательно, не так ли? Кроме того, данные остаются в db, поэтому я не думаю, что есть какая-то незавершенная транзакция. Есть ли способ быть уверенным? – Mario

+0

Также попытался отключить AutoCommit и явно зафиксировать. Это работает (т. Е. Commit() больше не вызывает исключение), но не решает проблему. – Mario

+0

Уже есть vrsion 5.1.10 разъема. – Mario

Смежные вопросы