Resource blocked
mike82 Apr 26, 2011 9:50 AMhi,
from time to time my seam application suffer from perfomance reasons. I have made java application to make dumps of JBoss server, when there is more than 10 concurrent database connections and what I spotted, most of the threads is in state blocked and stack trace shows that my class LanguageTools is involved. I use this class to get or set language which customer is using to browse my web page. Here's the class:
package com.mypage.tools; import java.util.Locale; import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Name; import org.jboss.seam.international.LocaleSelector; @Name("languageTools") public class LanguageTools { @In(create=true) private LocaleSelector localeSelector; @In(create=true) private Cookies cookies; public LanguageTools() {} public void setLangDa() { localeSelector.setLocale(new Locale("da", "DK")); localeSelector.select(); cookies.setCookieValue("Language", "da_DK", cookies.LANGUAGE_COOKIE_MAX_AGE); } public void setLangEn() { localeSelector.setLocale(new Locale("en", "US")); localeSelector.select(); cookies.setCookieValue("Language", "en_US", cookies.LANGUAGE_COOKIE_MAX_AGE); } public void setLangPl() { localeSelector.setLocale(new Locale("pl", "PL")); localeSelector.select(); cookies.setCookieValue("Language", "pl_PL", cookies.LANGUAGE_COOKIE_MAX_AGE); } public String getLanguage() { return localeSelector.getLanguage().toUpperCase().trim(); } public String getLanguage(Locale locale) { if(locale != null) { return locale.getLanguage().toUpperCase().trim(); } else { return localeSelector.getLanguage().toUpperCase().trim(); } } public String getLanguageLowerCase() { return localeSelector.getLanguage().toLowerCase().trim(); } public void setLanguage(String languageCode) { localeSelector.setLanguage(languageCode.toUpperCase().trim()); } public String getCountry() { return localeSelector.getCountry(); } public void setCountry(String countryCode) { localeSelector.setCountry(countryCode); } public Locale getLocale() { return localeSelector.getLocale(); } public Locale getLocale(String languageCode) { languageCode = languageCode.trim().toLowerCase(); if(languageCode.startsWith("da")) { return new Locale("da", "DK"); } else if(languageCode.startsWith("pl")) { return new Locale("pl", "PL"); } else { return new Locale("en", "US"); } } public void setLocale(Locale locale) { localeSelector.setLocale(locale); } public void setLocaleForLanguage(String languageCode) { if(languageCode == null || languageCode.length() == 0) { return; } languageCode = languageCode.trim().toLowerCase(); if(languageCode.startsWith("da")) { setLangDa(); } else if(languageCode.startsWith("pl")) { setLangPl(); } else { setLangEn(); } } }
I have read some performance posting and I wonder if I can tune this class a bit? The problem is that 2 most often methods are getLanguage and getLanguageLowerCase, so I can not use @BypassInterceptors amd use context lookup instead of injecting LocaleSelector. Or maybe I can.
Thanks a lot for any tip.
Michal