2013-05-28 34 views
1

我遇到一个非常奇怪的问题,我的Solr索引无法看到刚刚写入另一个连接上的MySQL数据库的更改。我该如何解决Solr/MySQL竞争条件?

下面是一连串事件:

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

在这一点上,然而,结果返回到Solr做包括最后添加的行,除非我作出改变到数据库后发送邮件到Solr之前立即插入一个sleep()电话。

*请注意,如果我真的在这一点上查询数据库,但是这需要足够的时间来实现由Solr实际获得的更改。如果我只是sleep(1)(一秒钟),也会发生同样的情况。

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

有没有人有任何建议/想法?我正在嘲笑这个。

回答

1

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

+0

'@@ AUTOCOMMIT'为1,但更改仍未被第二个连接拾取。 – devios1

+0

在一个单独的命令行中键入MySQL窗口,在您认为插入/提交了新记录后,运行查询进行验证。如果该行不存在或未更新,那么这是一个基本的提交或事务隔离设置问题。如果它在那里,然后Solr没有看到它,这是Solr查询中可能读取一些(旧)缓存值的问题。根据之前的评论,可能会出现这种情况,因为在一段时间之后它似乎被拾起(反映缓存超时情况)。 –

1

我通常不使用数据导入处理程序,并且网站中的更新会触发一种机制(内部或外部)将记录更新到Solr中,并使用正确使用的编程语言Solr Client。过去,我个人对数据导入处理程序没有太大的好运,因此更愿意使用自定义代码来将Solr与相应的数据存储平台进行同步。

+1

有趣。我基本上是在别人设计它之后进入这个领域的。我想用DIH是她的想法,并没有真正意识到其他选择。我肯定会研究这一点,但目前我只需要做到这一点。 :) – devios1