【发布时间】:2016-04-07 11:45:59
【问题描述】:
我有 2 个 entityManager 配置并正常工作(所有映射都正确加载等),使我能够使用 2 个数据库。
以与标准 Doctrine Command 任务允许 --em 或 --connection 参数类似的方式,我想有效地指定 EntityManager 并因此指定所使用的 DB。
我已经完成了在命令中切换容器引用的明显而骇人听闻的事情:
if ($input->getOption('background')) {
$this->container->set('doctrine.orm.entity_manager', $this->container->get('doctrine.orm.background_entity_manager'));
}
这适用于前 x 个数据库查询(是一个长时间运行的命令),但是当 Doctrine 执行重新连接时,似乎使用了默认 EntityManager 并且另一个数据库连接到:
2016-04-07T11:27:47.792427Z 783 Connect root@10.20.1.1 on partridge_background using TCP/IP
2016-04-07T11:27:47.802813Z 783 Query SELECT t0.id AS id_1, t0.name AS name_2, t0.last_completion AS last_completion_3, t0.last_run AS last_run_4, t0.bookie_id AS bookie_id_5 FROM feeds t0 WHERE t0.name = 'CORAL_OPENBET' LIMIT 1
2016-04-07T11:27:47.823585Z 783 Query SELECT c0_.id AS id_0, c0_.name AS name_1, c0_.canonicalised_name AS canonicalised_name_2, c0_.matchable_name AS matchable_name_3, c0_.display_order AS display_order_4, c0_.filtered AS filtered_5, c0_.name_alias AS name_alias_6, c0_.created_at AS created_at_7, c0_.updated_at AS updated_at_8, m1_.id AS id_9, m1_.domain_id AS domain_id_10, m1_.feed_id AS feed_id_11, m1_.feed_element_id AS feed_element_id_12, m1_.feed_request_url AS feed_request_url_13, m1_.feed_last_updated AS feed_last_updated_14, c0_.category2_id AS category2_id_15, m1_.domain_id AS domain_id_16 FROM category3 c2_, category3 c0_ INNER JOIN metacategory3 m1_ ON c0_.id = m1_.domain_id WHERE c0_.filtered = 0
2016-04-07T11:27:49.057129Z 784 Connect root@10.20.1.1 on partridge using TCP/IP
2016-04-07T11:27:49.060680Z 784 Query SELECT t0.id AS id_1, t0.name AS name_2, t0.canonicalised_name AS canonicalised_name_3, t0.matchable_name AS matchable_name_4, t0.display_order AS display_order_5, t0.filtered AS filtered_6, t0.name_alias AS name_alias_7, t0.created_at AS created_at_8, t0.updated_at AS updated_at_9, t0.category2_id AS category2_id_10 FROM category3 t0 WHERE t0.id = 48
2016-04-07T11:27:49.065852Z 784 Query SELECT t0.id AS id_1, t0.domain_id AS domain_id_2, t0.feed_id AS feed_id_3, t0.feed_element_id AS feed_element_id_4, t0.feed_request_url AS feed_request_url_5, t0.feed_last_updated AS feed_last_updated_6, t0.domain_id AS domain_id_7 FROM metacategory3 t0 WHERE t0.domain_id = 48
在框架生命周期中相对较晚地进行这种 EntityManager 切换显然是错误的方法。我想要的是某种 Symfony 引导事件监听器,它可以根据请求更改默认的 EntityManager(在这种情况下和 ArgvInput 参数,但如果可以监听任何类型的请求的参数会很好)。
我正在考虑在运行时进行某种动态配置操作?
【问题讨论】:
-
This works for the first x number of db queries (is a long-running command) but when the Doctrine performs a reconnect- 重新考虑是否真的有必要在长时间运行的命令中使用 Doctrine。 PHP 不是为做这些事情而设计的,而且——迟早——你会遇到内存泄漏。有关您的应用程序逻辑的更多信息将很有帮助。尤其是你如何冲洗你的 UoW? -
这个命令在默认的 EM 下运行良好,尽管 ORM 的开销也足够好。按照文档中的建议,间歇性地进行刷新
-
如何获取实体管理器实例?发布一些相关代码会有所帮助。
-
我在移动 ATM 上。所有电话都是通过 Doctrine manager 进行的,即$container->get('Doctrine.ORM.entity_manager')->getRepositoryXXXX
-
这将检索默认的 EM obv,但不能在 EM 检索的所有点添加开关