mysql写入后立即读取数据?

Posted

技术标签:

【中文标题】mysql写入后立即读取数据?【英文标题】:Mysql read data immediately after writing? 【发布时间】:2009-11-27 11:17:19 【问题描述】:

我正在使用 mysql DB 和 Java JDBC 客户端来访问它。

我有一个包含会话信息的表。每个会话都与一个 SessionToken 相关联。此令牌是一些会话值的哈希的 Base64 编码字符串。它应该是独一无二的。并在数据库中定义为 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

当我使用调试器单步执行此 UnitTest 并将即将发送到 db 的 select sql 复制到 mysql 命令行中时,它工作正常,并且我得到了会话行。

我还尝试通过请求较旧的 SessionToken 从数据库中检索较旧的会话。这也很好。如果我在插入 SessionToken 后立即要求它,它只会失败。

所有连接都在 AutoCommit 上。尽管如此,我还是尝试将事务级别设置为“未提交读取”。这也不起作用。

还有什么建议吗?

【问题讨论】:

【参考方案1】:

这通常是由于插入和选择之间的连接未提交造成的。

你基本做到以下几点了吗?

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

编辑我在 MySQL 5.1.30 和 Connector/J 5.1.7 上尝试了以下 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 驱动程序有问题。尝试升级。

【讨论】:

是的,这基本上就是我所做的。除此之外,由于 SQL 语法错误,commit() 将失败。我觉得很奇怪。我改为关闭()连接。无论如何,在自动提交模式下,这应该不是必需的,不是吗?此外,数据保留在数据库中,所以我认为没有任何未完成的事务。有什么办法可以确定吗? 还尝试禁用自动提交并明确提交。这有效(即 commit() 不再引发异常),但不能解决问题。【参考方案2】:

已解决:两个不同的标记字符串。其中一个最后有几个零字节。 (由于加密和解密和填充......)这两个字符串在视觉上是相同的,但是 MySQL 和 Java 都说,它们不是。 (而且他们和往常一样)

【讨论】:

以上是关于mysql写入后立即读取数据?的主要内容,如果未能解决你的问题,请参考以下文章

Java socket 读取后立即写入

在delphi中如何用clientsocket进行实时发送。。即在数据库读取到数据就立即发送出去。。

MySQL事务中的redo与undo

python读取mysql数据写入ES总结

PHP MySQL Yii - 数据库读取而不是写入

Php连接及读取和写入mysql数据库的常用代码