2011-07-27 47 views
1

我遇到的問題是,一個SingleThreadModel Servlet的最大池大小在Tomcat 5.5上限制爲20個實例。我不知道在Tomcat 5.5中如何配置它。如何配置實現SingleThreadModel的servlet的最大池大小?

我的HTTP連接聲明如下:

<Connector port="8090" maxHttpHeaderSize="8192" 
    maxThreads="150" minSpareThreads="25" maxSpareThreads="100" 
    enableLookups="false" redirectPort="8443" acceptCount="100" 
    connectionTimeout="20000" disableUploadTimeout="true" /> 

你知道我在哪裏可以配置呢?

+0

請告訴我們更多:你怎麼知道你正在達到這樣的限制?某處出現錯誤消息?你怎麼知道tomcat正在創建20個實例?你的意思是處理20個連接? –

+0

* servlet實例數量*和連接數量*之間存在差異。通常,servlet容器不會爲每個連接創建一個servlet實例。 – Jesper

+1

有一個重大的誤解正在發生。在整個應用程序的生命週期中,通常只有一個映射的servlet實例。也許你的servlet實現(從2003年開始棄用)SingleThreadModel接口? (在Tomcat上確實有20個實例的默認限制)。如果這是真的,只是擺脫那個棄用的接口,並重寫你的servlet,以使它是線程安全的。相關:http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC

回答

4

這是據我所知,不能由XML配置。

然而,它可以通過編程方式配置StandardWrapper#setMaxInstances()。您可以在實施SingleThreadModel的servlet的init()方法中執行此操作。我在Tomcat 7上測試它,它工作正常。

@Override 
public void init() throws ServletException { 
    try { 
     Field wrappedConfig = StandardWrapperFacade.class.getDeclaredField("config"); 
     wrappedConfig.setAccessible(true); 
     StandardWrapper standardWrapper = (StandardWrapper) wrappedConfig.get(getServletConfig()); 
     standardWrapper.setMaxInstances(100); 
    } catch (Exception e) { 
     throw new ServletException("Failed to increment max instances", e); 
    } 
} 

這在理論上不僅沒有一個Tomcat實例這是你無法控制的,並可能對特定類別的一些制約訪問策略工作。

+0

明天我會試試看,非常感謝! –

+0

我找到了一個方法,看到答案更新。 – BalusC

+0

嗨,我很抱歉再次打擾,但我只是一無所知......一旦這個類在服務器庫之上的catalina.jar裏面,我怎麼能加載我的servlet裏面的StandardWrapper? –

相關問題