1

我遇到了一个非常奇怪的问题,即我的 Solr 索引无法看到刚刚写入另一个连接上的 MySQL 数据库的更改。

以下是事件链:

  1. 用户在网站上启动一个操作,导致将一行添加到 MySQL 中的表中。
  2. 该行是通过mysql_query()(无事务)添加的。如果我从同一个连接再次查询数据库,我自然可以看到我刚刚所做的更改。*
  3. 通过 curl 立即向 Solr 实例发送一个调用,告诉它使用数据导入处理程序对其索引进行部分更新。
  4. Solr 通过单独的 JDBC 连接(相同的凭据和所有内容)连接到 MySQL 数据库,并对自上次更新以来更新的所有记录执行查询。

但是,此时返回给 Solr 的结果包括最后添加的行,除非我sleep()在对数据库进行更改之后并且在将消息发送到 Solr 之前立即插入一个调用。

*请注意,如果我此时确实确实查询了数据库,这需要足够的时间才能让 Solr 实际接收到更改。如果我只是sleep(1)(一秒钟)也会发生同样的情况。

我正在寻找的是一些可靠的解决方案,它可以让我确保 Solr 在发送刷新消息之前会看到更改。然而,根据我发现的所有文档,调用mysql_query()应该已经是原子的和同步的,并且在数据库更新之前不应将控制权返回给 PHP。因此,似乎没有任何我可以调用的函数来强制执行此操作。

有没有人有任何建议/想法?我正在用头撞这个。

4

2 回答 2

1

我通常不使用数据导入处理程序,并且会让网站中的更新触发一种机制(内部或外部),以使用适合所使用编程语言的Solr 客户端将记录更新到 Solr。我个人过去对数据导入处理程序不太满意,因此更喜欢使用自定义代码将 Solr 与相应的数据存储平台同步。

于 2013-05-28T20:03:28.473 回答
1

检查插入记录时自动提交设置的内容。刚插入的记录很可能在同一个数据库会话中,因此可以看到(但未提交)。在此之后,某些事件会导致提交发生,因此另一个线程/会话可以“看到”记录。还要检查事务隔离级别设置。

于 2013-05-28T18:15:45.757 回答