Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 石英2+;Hibernate 4多租户不稳定行为_Spring_Hibernate_Postgresql_Quartz Scheduler_Multi Tenant - Fatal编程技术网

Spring 石英2+;Hibernate 4多租户不稳定行为

Spring 石英2+;Hibernate 4多租户不稳定行为,spring,hibernate,postgresql,quartz-scheduler,multi-tenant,Spring,Hibernate,Postgresql,Quartz Scheduler,Multi Tenant,我目前正在实现一个多租户web应用程序,其中一些后台任务由计时器或Quartz作业运行 为此,我正在使用和使用基于模式的策略。模式切换是通过在我的MultiTenantConnectionProvider实现中调用以下命令来实现的: connection.createStatement().execute("SET search_path TO '" + tenantIdentifier + "'"); 这个问题只会在Quartz作业执行中出现,TimerTask下的相同代码不会出现任何问题。

我目前正在实现一个多租户web应用程序,其中一些后台任务由计时器或Quartz作业运行

为此,我正在使用和使用基于模式的策略。模式切换是通过在我的MultiTenantConnectionProvider实现中调用以下命令来实现的:

connection.createStatement().execute("SET search_path TO '" + tenantIdentifier + "'");
这个问题只会在Quartz作业执行中出现,TimerTask下的相同代码不会出现任何问题。出于很多原因,我想使用Quartz over Timer(持久性、错误处理、触发功能)

当作业迭代租户列表并在新事务中运行查询时,查询有时返回每个租户的正确值,有时返回另一个租户的值

我在Hibernate和Spring中启用了跟踪日志级别,我可以看到为每个租户打开的会话

我还跟踪了数据库日志中执行的语句,很明显出现了一些问题。这是一个ok执行:

SET search_path TO public

SET search_path TO 'tenantA'
BEGIN
/* criteria query */
select * from TABLE1_ this_ where this_.published_=
 = 't'
/* load one-to-many */
select * from TABLE2_ where id_table1_=
 = '1234'
COMMIT

SET search_path TO public

SET search_path TO 'tenantB'
BEGIN
/* criteria query */
select * from TABLE1_ this_ where this_.published_=
 = 't'
/* load one-to-many */
select * from TABLE2_ where id_table1_=
 = '5678'
/* load collection */
select * from TABLE3_  where id_table2_=
 = '9876'
COMMIT

SET search_path TO public
当问题显现时,这与执行相同:

SET search_path TO public

SET search_path TO 'tenantA'
BEGIN
/* criteria query */
select * from TABLE1_ this_ where this_.published_=
 = 't'
/* load one-to-many */
select * from TABLE2_ where id_table1_=
 = '5678'
/* load collection */
select * from TABLE3_  where id_table2_=
 = '9876'
COMMIT

SET search_path TO public

SET search_path TO 'tenantB'
BEGIN
/* criteria query */
    select * from TABLE1_ this_ where this_.published_=
 = 't'
/* load one-to-many */
select * from TABLE2_ where id_table1_=
 = '1234'
COMMIT

SET search_path TO public
在这种情况下,查询被交换,在其他情况下,对两个租户执行相同的查询。在分析数据库日志时,对于相同的查询,sessionid似乎是相同的

三重检查我自己,我打印
显示搜索路径的结果在事务中,它始终返回正确的路径

同样,当代码在TimerTask内运行时,这种行为不存在

有什么想法吗?我意识到这是一个复杂的问题,如果你没有亲身经历过,就很难理解。但这正是我所希望的,有人已经经历了同样的过程,并且能够对这件事有所了解。 如果需要,我可以提供进一步的信息,但目前我认为足以说明这个问题

环境:

  • 爪哇7
  • 春季3.2.6
  • 冬眠4.2.12
  • 石英2.2.1
  • PostgreSQL 9.1

找到了正常的解决方案。不是Hibernate多租户问题。我尝试实现自己的数据源代理机制,但问题仍然存在。也没有石英问题,即使是我之前报告的在这种情况下发生的问题,也是众多问题之一。完全禁用石英后,其他问题也会以同样的不稳定和随机方式出现

解决方案:使用Postgressql9.3

为什么??不知道。在阅读变更日志时浪费了几分钟,但经过几天的努力,我还有很多事情要赶。如果有人有线索,请分享