Olá pessoal,
Já estou tendo este problema faz um tempinho e gostaria de contar com a ajuda de vocês.
Agradeço de antemão a todos que puderem me dar uma luz neste caso. Valeu! 
O problema é:
Logo após o cadastro de um usuário eu faço N requisições assíncronas no servidor, e tem vezes ele me retorna o resultado esperado e outras não.
Exemplo:
Tenho um action chamado loadRSSThreads.action
Ele recebe um parâmetro: idRSS.
Eu faço N requisições assincronas para este action passando vários id’s diferentes, meu problema está no fato que de vez em quando ele me retorna dados, outras vezes não.
Meu aplicativo funciona desta maneira:
Primeiro o usuário se cadastra e depois se todos os dados estiverem corretos eu redireciono ele para a página principal, onde ele pode ler vários RSS.
Caso o usuário já seja cadastrado ele faz o login e é redirecionado para a página principal.
O mais estranho é que só ocorre no cadastro, e se ocorrer uma vez ele continua ocorrendo.
Se por exemplo eu não cadastrar ninguém e só realizar logins todos os requests assíncronos funcionam corretamente.
Se eu realizar um cadastro logo após de iniciar o tomcat ele também irá funcionar corretamente.
Agora se eu fizer um cadastro após outro cadastro ou após um login ele gera os erros que ficam sendo gerados até eu reiniciar o tomcat.
Segue agora alguns códigos que eu estou utilizando:
HibernateUtil (eu sei que está bem ruim, eu estava utilizando ThreadLocal, mas ele também gerava erro. Resolvi então abrir uma conexão a cada request s
o para garantir o funcionamento, mas não surtiu efeito.)
package br.org.indt.myweb.util;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
public class HibernateUtilNoLocalVariable {
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
} catch (Throwable ex) {
// Log exception!
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() throws HibernateException {
return sessionFactory;
}
}
Codigo da action do struts
public String loadRSSThreads() {
session = this.getSession();
String login = (String) session.get("userlogged");
factoryUserManagerWeb = UserManagerWebFactory.getInstance();
serviceUserManagerWeb = factoryUserManagerWeb
.getUserManagerWebService();
List<RSSItemDTO> listRSSItemDTO = new ArrayList<RSSItemDTO>();
System.out.println("##################### idRSS " + idRSS);
try {
String urlRSS = serviceUserManagerWeb.getFeedURL(Long
.parseLong(String.valueOf(idRSS)));
System.out.println("##################### urlRSS " + urlRSS);
listRSSItemDTO = serviceUserManagerWeb.getThreadsFromCache(urlRSS);
serviceUserManagerWeb.updateLayoutItemThreads2(idLayoutItem, idRSS,
listRSSItemDTO); //erro ocorre aqui.
// serviceUserManagerWeb.updateLayoutItemThreads(login, idRSS,
// listRSSItemDTO);
rssThreads = serviceUserManagerWeb.getFeedsList2(idLayoutItem, idRSS);
System.out.println("TAMANHO DO RSS THREAD E: " + rssThreads.size());
} catch (MyWebException e) {
}
return SUCCESS;
}
O erro ocorre neste metodo:
public void updateLayoutItemThreads2(long idLayoutItem, long idRSS,
List<RSSItemDTO> rssList) throws MyWebException {
SessionFactory sessionFactory = HibernateUtilNoLocalVariable.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
LayoutItem layoutItem = (LayoutItem) session.get(LayoutItem.class,
idLayoutItem);
if (layoutItem == null) {
List<LayoutItem> list = session.createQuery("FROM LayoutItem WHERE id = ?").setLong(0, idLayoutItem).list();
layoutItem = list.get(0);
}
for (int i = 0; i < layoutItem.getLayoutItemThreads().size(); i++) {
session.delete(layoutItem.getLayoutItemThreads().get(i));
}
layoutItem.getLayoutItemThreads().clear();
for (int i = 0; i < rssList.size(); i++) {
RSSItemDTO rssItemDTO = rssList.get(i);
LayoutItemThread layoutItemThread = new LayoutItemThread();
layoutItemThread.setLayoutItem(layoutItem);
layoutItemThread.setTitle(rssItemDTO.getTitle());
layoutItemThread.setDescription(rssItemDTO.getDescription());
String strContent = rssItemDTO.getContents();
layoutItemThread.setContent(strContent);
layoutItemThread.setURL(rssItemDTO.getURL());
session.save(layoutItemThread);
layoutItem.getLayoutItemThreads().add(layoutItemThread);
}
session.save(layoutItem);
tx.commit();
session.close();
}
Javascript que chama o action:
function loadRSSThreads(box_id, layout_item_id) {
$.ajax({
type: 'GET',
url: "loadRSSThreads.action",
data: "nocaching="+ (new Date().getTime()) + "&idRSS=" + box_id + "&idLayoutItem=" + layout_item_id,
dataType: 'html',
beforeSend: function(xmlHttpRequest) {
$("#" + box_id + "content").hide();
$("#" + box_id + "content_loading").show();
},
success: function(data, textStatus) {
$("#" + box_id + "content").html(data);
$("#" + box_id + "content_loading").hide();
$("#" + box_id + "content").show();
}
});
}
O erro é o seguinte: Ele não me retorna o LayoutItem de alguns request, sendo que ele existe no banco de dados.
Valeu pessoal !
Abraços