Mysql читать данные сразу после записи? - PullRequest
1 голос
/ 27 ноября 2009

Я использую базу данных MySQL и клиент JDBC Java для доступа к ней.

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

Когда я пытаюсь найти сеанс по его токену, я запрашиваю базу данных, используя оператор 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, он работает нормально, и я возвращаю строку сеанса назад.

Я также попытался получить более старую сессию из БД, запросив более старую SessionToken. Это тоже хорошо работает. Сбой только в том случае, если я запрашиваю SessionToken сразу после того, как я его вставил.

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

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

Ответы [ 2 ]

1 голос
/ 27 ноября 2009

Обычно это вызвано тем, что соединение не было зафиксировано между вставкой и выбором.

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

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 голосов
/ 27 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...