Spring 石英2+;Hibernate 4多租户不稳定行为
我目前正在实现一个多租户web应用程序,其中一些后台任务由计时器或Quartz作业运行 为此,我正在使用和使用基于模式的策略。模式切换是通过在我的MultiTenantConnectionProvider实现中调用以下命令来实现的: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下的相同代码不会出现任何问题。
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
为什么??不知道。在阅读变更日志时浪费了几分钟,但经过几天的努力,我还有很多事情要赶。如果有人有线索,请分享