1

问题已解决:谢谢大家,请参阅下面的答案。

我有一个在 Tomcat 5.5 中运行的网站,它使用 Hibernate3 连接到 MySQL5 数据库。

一个记录只是拒绝保留对其执行的任何更改。如果我以编程方式更改记录,则值将恢复为以前的值。

如果我手动修改数据库中的记录,这些值将恢复(似乎一旦 webapp 访问它们)。

我尝试停止 Tomcat 并手动更改值,然后再次启动 Tomcat。检查数据库,在 Tomcat 启动 webapp 后值保持不变,但一旦我加载站点就会再次恢复。

我还尝试删除 webapp 和 .ser 缓存文件的 Tomcat 工作文件夹。

我还检查了正在恢复的值的代码,但找不到它们。

我只在这张专辑中注意到了这一点。

编辑:我刚刚使用 hibernate.show_sql=true 查看了 Hibernate 的 SQL 输出。我的行所在的表记录了一个更新查询。有谁知道如何解决?列到实际值?

4

6 回答 6

1

您可以暂时启用 mysql 查询日志记录并准确查看哪些 sql 语句更改了该值。由于您说它在服务器启动后立即更改,您应该能够很快找出该语句。

http://dev.mysql.com/doc/refman/5.0/en/query-log.html

于 2008-10-16T02:33:20.137 回答
1

要回答您的问题:

有谁知道如何解决?列到实际值?

你可以用p6spy做到这一点。此处提供了有关如何在 Spring 应用程序中进行设置的说明。

但是,我认为这些说明中有一个错误,他们称为 p6spy.log 的文件实际上应该是名称 p6spy.properties。

于 2008-10-16T15:51:46.843 回答
0

它越来越接近万圣节,所以你必须期待这种事情(加上它只是一个满月),但我会继续寻找网络应用程序中的罪魁祸首......它必须在那里。我会立即在 webapp 源代码中搜索几个值:

  • 正在更改的记录的 ID。
  • 写入记录的值。

祝你好运......这些可以找到真正的熊!

于 2008-10-16T01:45:52.557 回答
0

这闻起来有点像启动时触发的测试用例,它将行修改为测试前的预期。

于 2008-10-16T01:46:31.090 回答
0

在更新之前添加一个触发器,检查行 ID,如果它与您的魔法行匹配,则引发 SQL 错误。然后检查生成的堆栈跟踪,遍历代码并找到更新行的部分。

于 2008-10-16T02:19:16.703 回答
0

感谢大家的帮助。所有的建议都派上用场追踪它。

我已经设法找出导致它的原因。糟糕的数据库设计、多个数据模型和 Hibernate 导致了一些讨厌的东西。另一个表存储了值,并且该类正在扩展具有相同值的基类。

是时候考虑做一些标准化了。

于 2008-10-16T22:09:00.013 回答