InternCache - intern() method causing thread synchronization issue

View: New views
1 Messages — Rating Filter:   Alert me  

InternCache - intern() method causing thread synchronization issue

by vadheraju1 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

We are using AXIS  and Xfire as our soap stacks which internally use woodstox. and In a load test, we see thread are waiting on InternCache object - due to the fact that intern() method is Synchronized.
We changed the code it seems to be fixed the issue; we need someone from woodstox team to confirm our change.

Jar : wstx-asl-3.0.1
Stack Trace:
at com.ctc.wstx.util.InternCache.intern(InternCache.java:40) - waiting to lock [0x942373a0] (a com.ctc.wstx.util.InternCache) at com.ctc.wstx.sr.NsInputElementStack.resolveAndValidateElement(NsInputElementStack.java:305) at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:2826) at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2737) at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1004) at org.codehaus.xfire.util.stax.DepthXMLStreamReader.next(DepthXMLStreamReader.java:252) at org.codehaus.xfire.util.stax.FragmentStreamReader.next(FragmentStreamReader.java:79) at org.codehaus.xfire.util.jdom.StaxBuilder.buildTree(StaxBuilder.java:466) at org.codehaus.xfire.util.jdom.StaxBuilder.build(StaxBuilder.java:215) at org.codehaus.xfire.soap.handler.ReadHeadersHandler.readHeaders(ReadHeadersHandler.java:134) at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:59) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client.Client.onReceive(Client.java:406) at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139) at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48) at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26) at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79) at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114) at org.codehaus.xfire.client.Client.invoke(Client.java:336) at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77) at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57) at $Proxy2.doCompleteAndTrackForms(Unknown Source) at com.metavante.eds.deposit_origination.common.DoBusSvcsDao.invokeBusService(DoBusSvcsDao.java:104) at com.metavante.eds.common.pages.print_forms.PrintFormsSH.doNavigateOff(PrintFormsSH.java:873)

Class Name and Method Name:
com.ctc.wstx.util.InternCache.intern

Current Implementation:
public synchronized String intern(String input) {
        String result = (String) get(input);
        if (result == null) {
            result = input.intern();
            put(result, result);
        }
        return result;
    }

New implementation:
public String intern(String input) {
        String result = (String) get(input);
        if (result == null) {
            result = putInCache(input);
        }
        return result;
    }
public synchronized String putInCache(String input) {
            String result = input.intern();
            put(result, result);
            return result;
    }