当前位置: 首页 > 知识库问答 >
问题:

使用Spring JpaTransactionManager时Eclipse链接中未处理的并发性

越霖
2023-03-14

这里的日志:

任何处理并发问题的帮助或方法。

类似于:eclipselink-error:试图在不关闭会话的情况下重新部署会话

TenantResolver<Tenant> tenantResolver; 
SchemaProvider schemaProvider; 
@Autowired
public void setTenantResolver(TenantResolver<Tenant> tenantResolver) {
    this.tenantResolver = tenantResolver;
}

@Autowired(required = false)
public void setSchemaProvider(SchemaProvider schemaProvider) {
    this.schemaProvider = schemaProvider;
}

@Override
protected synchronized javax.persistence.EntityManager createEntityManagerForTransaction() {
    boolean refreshed = false;
    EntityManager em = super.createEntityManagerForTransaction();
    try {
        LOGGER.info("Entering createEntityManagerforTransaction()");
        if (schemaProvider != null) {
            TenantSessionCustomizer.setSchemaName(schemaProvider.getSchema());
        }
        ServerSession ss = ((EntityManagerImpl) em.getDelegate()).getServerSession();
        Map sessionProp = ss.getProperties();
        String actualTenant = (String) sessionProp.get(PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT);
        LOGGER.info("MultiTenantJpaTransactionManager.createEntityManagerForTransaction()-> ACTUAL_TENANT : " + actualTenant);

        if (tenantResolver != null && tenantResolver.getCurrentTenant() != null) {
            LOGGER.info("MultiTenantJpaTransactionManager.createEntityManagerForTransaction()-> CURRENT_TENANT : " + tenantResolver.getCurrentTenant());
            if ((actualTenant == null) || (actualTenant != null && !actualTenant.equals(tenantResolver.getCurrentTenant().getHandle()))) {
                sessionProp.put(PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT, tenantResolver.getCurrentTenant().getHandle());
                sessionProp.put(PersistenceUnitProperties.SESSION_CUSTOMIZER, TenantSessionCustomizer.class.getName());
                MetadataRefreshListener mrl = ((EntityManagerImpl) em.getDelegate()).getServerSession().getRefreshMetadataListener();
                if (mrl != null) {
                    Map<String, Object> prop = new HashMap<String, Object>();
                    mrl.triggerMetadataRefresh(prop);
                    refreshed = true;
                    LOGGER.info("createEntityManagerforTransaction()---->Metadata refreshed");
                }
            }
        }
    } catch (Exception ex) {
        LOGGER.error("MultiTenantJpaTransactionManager.createEntityManagerForTransaction()-> Exception while creating EntityManagerForTransaction " + ex.getMessage());
    }
    return refreshed ? super.createEntityManagerForTransaction() : em;
}

共有1个答案

澹台阳秋
2023-03-14

公共类MultiTenantJpaTransactionManager扩展JpaTransactionManager{private static final Logger Logger=loggerFactory.getLogger(MultiTenantJpaTransactionManager.class);

TenantResolver<Tenant> tenantResolver; 
SchemaProvider schemaProvider;

@Autowired
public void setTenantResolver(TenantResolver<Tenant> tenantResolver) {
    this.tenantResolver = tenantResolver;
}

@Autowired(required = false)
public void setSchemaProvider(SchemaProvider schemaProvider) {
    this.schemaProvider = schemaProvider;
}

@Override
protected synchronized javax.persistence.EntityManager createEntityManagerForTransaction() {
    boolean refreshed = false;
    EntityManagerFactory emf = getEntityManagerFactory();
    EntityManager em = super.createEntityManagerForTransaction();
    try {
        LOGGER.info("Entering createEntityManagerforTransaction()");
        if (schemaProvider != null) {
            TenantSessionCustomizer.setSchemaName(schemaProvider.getSchema());
        }
        ServerSession ss = ((EntityManagerImpl) em.getDelegate()).getServerSession();
        Map sessionProp = ss.getProperties();

        if (tenantResolver != null && tenantResolver.getCurrentTenant() != null) {
            sessionProp.put(PersistenceUnitProperties.MULTITENANT_PROPERTY_DEFAULT, tenantResolver.getCurrentTenant().getHandle());

            em = emf.createEntityManager(sessionProp);
        }
    } catch (Exception ex) {
        LOGGER.error("MultiTenantJpaTransactionManager.createEntityManagerForTransaction()-> Exception while creating EntityManagerForTransaction " + ex.getMessage());
    }
    return em;
}

}

目前使用上面的代码进行测试,似乎已经修复了这个问题。

 类似资料:
  • 有没有可能实现这样的事情: 我希望清楚我的意图是什么。

  • 本文向大家介绍Go并发调用的超时处理的方法,包括了Go并发调用的超时处理的方法的使用技巧和注意事项,需要的朋友参考一下 之前有聊过 golang 的协程,我发觉似乎还很理论,特别是在并发安全上,所以特结合网上的一些例子,来试验下go routine中 的 channel, select, context 的妙用。 场景-微服务调用 我们用 gin(一个web框架) 作为处理请求的工具,需求是这样的

  • 我正在用s设计异步调用。这是一个批处理调用,在这里我需要同时处理几个实体。在呼叫结束时,我必须收集关于每一个项目的处理状态的信息。 作为输入,我有这些实体的ID数组。这是一个复杂的实体,为了将一个实体编译成一个对象,我必须发出几个DAO调用。每个DAO方法都返回。 我将那些DAO调用链接起来,因为如果其中一个部分不存在,我将无法构造一个完整的对象。下面是我的代码段的样子: 问题是,由于链接的关系,

  • 问题内容: 当前,我们在数据层中使用JDBC,并计划用hibernate代替它。我是Hibernate的新手,不确定Hibernate如何处理并发。如果我们使用spring进行事务管理,有人可以解释一下我如何处理并发更新:通过hibernate(在内存中进行hibernate的自动版本管理),或者我必须将version列放入数据库中以手动处理并发更新。 问题答案: 无论你是否使用Spring进行事

  • 我看到公司中的一个应用程序使用 JMS 进行并发调用。该应用程序是在Spring编写的Web服务。这将进行许多外部调用。当收到操作请求时,它会将许多消息发布到JMS队列,MDB处理这些消息。然后,应用程序整理所有响应,将其映射回其数据模型并返回响应。我过去曾使用JMS进行火灾和遗忘调用,但我无法弄清楚应用程序如何等待来自JMS队列的响应。请问您能解释一下是否有办法吗?

  • 如果一个属性被配置为并发标记,那么在保存属性记录的期间 EF 将会制止其他用户修改该属性在数据库中的值。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。 EF Core 是如何处理并发的 关于 Entity Framework Core 是如何处理并发的详细描述请查阅 并发标记。 解决并发冲突 解决并发冲突需要使用算法来将当前用户的挂起更改与数据库变更合并。具体的方法根据不同的应用程