需要在 Java 中存储会话/事务数据

Need to store data for session/ transaction in Java

我公开了一些 Web 服务 (Weblogic Jdk 1.6),在这些方法的 XML 请求中有一个 MarketType 元素。

我需要在一些工厂 POJO 中访问这个 Xml 元素值,所以我的工厂他们自己知道对于这个 "session/transaction" 市场类型是 ABC,所以当代码需要一个来自工厂,工厂 returns MarketType 特定对象..
现在,所有代码和所有层的 MarketType 值都需要 'dragged',因为在代码中调用不同位置的工厂需要该值。

那么 how/where 我要存储这个值吗?以及如何以安全的方式访问它?

这里是一些今天的代码:

interface DataFactory {
    PriceCalulator getPriceCalculator(MarketType type);
}

class DataFactoryImpl implements DataFactory {

    public PriceCalulator getPriceCalculator(MarketType type) {
        switch(type) {
            case : DK   {
                return new DKPriceCalculator();
            }
            case : NL {
                return new NLPriceCalculator();
            }    
        }  
    }
}

我希望能够做类似

的事情
public XmlCalcResult price(XmlRequest request) {
    ServicePrice impl = new ServicePrice();
    // Set MarkeType in "Global/Session" ..
    MarketType type = SessionScope.setMarketType(request.getMarketType()) 

    return impl.executePrice(ctx, session, request);
}

class ServicePrice {
    public XmlCalcResult executePrice(ctx, session, request) {
       PriceCalulator calc = DataFactoryImpl.getPriceCalculator();

       return new XmlCalcResult(calc.doCalculation()) ;
    }
}

interface DataFactory {
    PriceCalulator getPriceCalculator();
}

class DataFactoryImpl implements DataFactory {

    // Get from "Global/Session" ..
   MarketType type = SessionScope.getMarketType()  


    public PriceCalulator getPriceCalculator() {
        switch(type) {
            case : DK   {
                return new DKPriceCalculator();
            }
            case : NL {
                return new NLPriceCalculator();
            }    
        }  
    }
}

一种选择是将 MarketType 元素存储在 ThreadLocal 中,以便可以从不同位置向下访问它。始终在线程完成其任务之前对 ThreadLocal 实例调用 remove()。这一点很重要,因为在 servlet 容器中,线程会被重用,如果不清除 ThreadLocal 可能会导致内存泄漏。调用 set 和 remove 的适当位置可以是过滤器。