【问题标题】:Is SAP JCO thread safe?SAP JCO 线程安全吗?
【发布时间】:2011-12-26 14:03:45
【问题描述】:

我并没有真正设法找到有关此的适当文档。 JCO com.sap.conn.jco.JCoDestinationcom.sap.conn.jco.JCoDestinationManager 中有类。我对他们的问题:

  • 它们是线程安全的吗?
  • 如果不是,创建它们是否昂贵?

【问题讨论】:

  • 我看到的建议是,如果某些代码的文档没有说它是线程安全的,你应该假设它不是。

标签: java thread-safety sap jco


【解决方案1】:

你读过连接器的文档吗?

https://websmp105.sap-ag.de/~sapidb/011000358700000730362009D/SAPJCo_Doku_3.0_EN.pdf

我不明白你的问题,你尝试调用 RFC 并没有实现?

【讨论】:

    【解决方案2】:

    我想我终于找到了。 http://help.sap.com/saphelp_nwpi711/helpdata/en/48/6437ccbdbc51eee10000000a421937/content.htm

    注意 在多线程环境中,必须小心地实现不同线程之间的对象(例如,JCoTable 对象)分布。请注意,不能为同一个直接连接进行多个并发 SAP 调用。

    所以它不是线程安全的

    【讨论】:

    • 区分实例是否是线程安全的和是否是;描述每个线程有一个实例是否是一种可接受的解决方法。 (我知道一些使用这种模型的系统,但根本不了解 SAP。)
    • 问题是我们目前有一个类是一个spring单例,每次RFC调用都会调用它,这个类有两个成员变量,上面提到的两个类。对于任何操作,都会使用这两个实例。我觉得不行,因为 SAP 文档中的示例总是使用本地变量作为目标对象。
    • 您可以尝试使用不同的生命周期,例如prototypesession
    【解决方案3】:

    对于整个 JCo 框架,不能说它是否是线程安全的。 这取决于使用的类和实例。

    JCo 中的数据容器实例,如 JCoFunctionJCoTableJCoStructureJCoRecord,不是线程安全的 - 幸运的是,因为它们通常不会同时从不同的线程访问,因此不会自动同步这些实例带来更好的性能。

    但是类和静态方法在 JCo 中是线程安全的。例如,您不需要同步对JCoDestinationManager 的调用。

    JCoDestination 是一个特例。通常你不需要同步你对这个实例的调用,因为它会在内部为每个会话创建和使用不同的 RFC 客户端连接对象。在 JCo 的默认实现中,每个线程都被视为单独的会话,因此您不会在此处遇到线程安全问题。仅当基础架构环境在 JCo 运行时注册自己的 SessionReferenceProvider 并同时将相同的会话 ID 分配给多个线程时,可能有状态的线程安全冲突 对同一目的地的 RFC 调用。在这种情况下,JCo 检测到这样的错误情况并抛出带有错误组 JCO_ERROR_CONCURRENT_CALLJCoException

    【讨论】:

      猜你喜欢
      • 2017-02-01
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      • 2010-12-27
      相关资源
      最近更新 更多