在作BI Project的時候遇到了一個很好玩的問題,整個設計很簡單,NFS的flat file經java進行parsing,而後生成raw data flat file,用sqlldr batch upload到oracle db,business object web portal會按期生成分析數據,報表,show給user看。
期間使用了spring來進行oracle db數據的分析。下面是web.xml的一段。
<servlet>
<servlet-name>lda</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/ldaContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/ldaContext.xml</param-value>
</context-param>
這裏有一個很明顯的bug,不知道看出來沒有?
對了,ldaContext.xml裝載了兩次,可是有什麼關係呢?有關係,你能夠作一個試驗,寫一個context xml,用application context的getbean來獲取一個bean id 1的bean instance,同時用di來注入一樣的bean id 1給另外一個bean instance,你會發現,getbean get出來的實例和用di注進去的實例,竟然是兩個徹底不一樣的object,哈哈,好玩吧,不知道這個算不算Spring的bug,用的是同一個spring context,可是若是裝載兩次如出一轍的bean id時,沒有提示任何錯誤,若是不作debug,你根本不知道你第一次拿到的實例和第二次拿到的實例竟然是徹底不一樣的object。
這個bug致使咱們在使用多線程的時候,不斷的新開新線程,而不是使用同一個線程實例,由於咱們expect get bean出來的實例,而後di給一個controller class,兩個實例應該是同一個來的,可是實際上不是,呵呵。