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写入后立即读取数据?的主要内容,如果未能解决你的问题,请参考以下文章