Métodos estáticos em servlets (ESCLARECIDO)

Obas, pessoal,

Eu estava lendo o artigo do GUJ sobre Thread Safety com Servlets (muito bom) e me surgiu a seguinte situação:

Eu utilizo servlet extendendo de HttpServlet reescrevo o método service() onde eu recebo do menu principal do sistema as urls=‘servlet?metodo=X’. Dentro do método service(), eu vejo o parametro ‘metodo’ e aciono as rotinas do sistema por ele.

protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException { 

String metodo = request.getParameter("metodo");

if ( metodo.equals("cadastroX") )
    jsp = CadastroX.execute(request);
else if ( metodo.equals("cadastroY") )
    jsp = CadastroY.execute(request);
...

}

Os métodos execute() das classes CadastroX, Y, etc são estáticos, ou seja, eu não instancio as classes CadastroX, Y, etc para acionar os métodos.

DÚVIDA (finalmente, rsrs): Lendo sobre o atigo acima ‘TheradsSafe’ fiquei meio preocupado se múltiplos usuários acessarem as rotinas ao mesmo tempo e isso me dar problemas.

Gostaria de saber se é correto eu acionar as rotinas do sistema usando métodos estáticos ou eu deveria tirar o static dos métodos dos cadastros? Informando que tenho rotinas críticas, por exemplo, de lançamento de itens, produtos, vendas, etc. etc.

No aguardo do apoio da comunidade,

Vlw.

[quote=ibispo]Obas, pessoal,

Eu estava lendo o artigo do GUJ sobre Thread Safety com Servlets (muito bom) e me surgiu a seguinte situação:

Eu utilizo servlet extendendo de HttpServlet reescrevo o método service() onde eu recebo do menu principal do sistema as urls=‘servlet?metodo=X’. Dentro do método service(), eu vejo o parametro ‘metodo’ e aciono as rotinas do sistema por ele.

protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException { 

String metodo = request.getParameter("metodo");

if ( metodo.equals("cadastroX") )
    jsp = CadastroX.execute(request);
else if ( metodo.equals("cadastroY") )
    jsp = CadastroY.execute(request);
...

}

Os métodos execute() das classes CadastroX, Y, etc são estáticos, ou seja, eu não instancio as classes CadastroX, Y, etc para acionar os métodos.

DÚVIDA (finalmente, rsrs): Lendo sobre o atigo acima ‘TheradsSafe’ fiquei meio preocupado se múltiplos usuários acessarem as rotinas ao mesmo tempo e isso me dar problemas.

Gostaria de saber se é correto eu acionar as rotinas do sistema usando métodos estáticos ou eu deveria tirar o static dos métodos dos cadastros? Informando que tenho rotinas críticas, por exemplo, de lançamento de itens, produtos, vendas, etc. etc.

No aguardo do apoio da comunidade,

Vlw.[/quote]
Depende bastante do que vc colocou no metodo.
Posta o codigo aí pra a gente dar uma olhada :shock:

Obas,

Segue abaixo um exemplo: Esse metodo execute() tem um comportamento duplo: Se acionado do menu ou se acionado do cadastro.


public static String execute(HttpServletRequest request, boolean fromMenu, String tabela ) {

    	String jsp = "";

    	try {

        	Usuarios dadosUsu = (Usuarios) request.getSession().getAttribute( 
            		Utilitarios.SESSAO_DADOS_USUARIO );
    		
        	AcessoDAO acessoDAO = new AcessoDAO();
        	TabelasCadastroDAO tabelasCadastroDAO = new TabelasCadastroDAO();
        	
    		/*
    		 * Controle de acesso (se for acionado do menu)
    		 */
        	if ( fromMenu ) {

	        	String chaveModulo = "Cad" + tabela;
	    		String retornoAcesso =
	    			acessoDAO.getAcesso(dadosUsu, chaveModulo, Utilitarios.ACESSO_LER);
	
	    		if ( !"".equals(retornoAcesso) ) {
	    			request.setAttribute( "msgAcesso", retornoAcesso ); 
		            jsp = "pages/acessDenied.jsp";
		            return jsp;
				}

        	}
        	
    		/*
    		 * Parâmetros
    		 */
    		
        	String campoPesquisa = (String) request.getParameter("campoPesq");
        	ArrayList<TabelasCadastro> listTabela = new ArrayList<TabelasCadastro>();

        	if ( !fromMenu ) {
	        	listTabela = tabelasCadastroDAO.getAll( tabela, campoPesquisa );
        	}
        	
            request.setAttribute( "tabCadastro", tabela ); 
            request.setAttribute( "nmTela", Constantes.getNomesTabelasHTML(tabela, true) ); 
            request.setAttribute( "listTabela", listTabela );
            request.setAttribute( "campoPesq", campoPesquisa );
            
            jsp = "pages/cadastros/tabelasCadastroLista.jsp";
            
        } catch (Exception e) {

        	String erro = Utilitarios.showStackTrace(e);
	        request.setAttribute( "erro", erro );
	        jsp = "pages/erro.jsp";
	        
        }
        
        return jsp;
    }

Vlw.

[quote=ibispo]Obas,

Segue abaixo um exemplo: Esse metodo execute() tem um comportamento duplo: Se acionado do menu ou se acionado do cadastro.


public static String execute(HttpServletRequest request, boolean fromMenu, String tabela ) {

    	String jsp = "";

    	try {

        	Usuarios dadosUsu = (Usuarios) request.getSession().getAttribute( 
            		Utilitarios.SESSAO_DADOS_USUARIO );
    		
        	AcessoDAO acessoDAO = new AcessoDAO();
        	TabelasCadastroDAO tabelasCadastroDAO = new TabelasCadastroDAO();
        	
    		/*
    		 * Controle de acesso (se for acionado do menu)
    		 */
        	if ( fromMenu ) {

	        	String chaveModulo = "Cad" + tabela;
	    		String retornoAcesso =
	    			acessoDAO.getAcesso(dadosUsu, chaveModulo, Utilitarios.ACESSO_LER);
	
	    		if ( !"".equals(retornoAcesso) ) {
	    			request.setAttribute( "msgAcesso", retornoAcesso ); 
		            jsp = "pages/acessDenied.jsp";
		            return jsp;
				}

        	}
        	
    		/*
    		 * Parâmetros
    		 */
    		
        	String campoPesquisa = (String) request.getParameter("campoPesq");
        	ArrayList<TabelasCadastro> listTabela = new ArrayList<TabelasCadastro>();

        	if ( !fromMenu ) {
	        	listTabela = tabelasCadastroDAO.getAll( tabela, campoPesquisa );
        	}
        	
            request.setAttribute( "tabCadastro", tabela ); 
            request.setAttribute( "nmTela", Constantes.getNomesTabelasHTML(tabela, true) ); 
            request.setAttribute( "listTabela", listTabela );
            request.setAttribute( "campoPesq", campoPesquisa );
            
            jsp = "pages/cadastros/tabelasCadastroLista.jsp";
            
        } catch (Exception e) {

        	String erro = Utilitarios.showStackTrace(e);
	        request.setAttribute( "erro", erro );
	        jsp = "pages/erro.jsp";
	        
        }
        
        return jsp;
    }

Vlw.[/quote]
O ideal pra vc é utilizar um controle de transação pra evitar a inconsistencia do banco a acessos simultêneos, isso se vc ainda não estiver usando, no mais particularmente não vejo problema.

Você poderia me ajudar a entender melhor isso?. Hoje nas DAOs eu utilizo alguma coisa assim:

public boolean update( CadastroBean dadosCadastro ) {
		
	boolean retorno = true;
    	
    	try {

    		beginConnection();

        	connection.setAutoCommit(false);
    		
        	if ( dadosCadastro.getId() == 0 ) {
        	
	            sql = "INSERT INTO CadastroX " +
		              "( Nome, Endereco, ID ) " +
		              "VALUES " +
		              "( ?, ?, ? )";

        	} else {
        		
	            sql = "UPDATE CadastroX " +
		              "SET Nome = ?, Endereco = ?" +
		              "WHERE ID = ?";
        		
        	}
            
            pStmt = connection.prepareStatement(sql);

            pStmt.setString(1, dadosCadastro.getNome() );
            pStmt.setString(2, dadosCadastro.getEndereco() );
            pStmt.setInt(3, dadosCadastro.getId() );
            
            pStmt.executeUpdate();
            
            connection.commit();

        } catch (Exception e) {
        	retorno = setCatch(e);
	} finally {
        	setFinally();
        }
		
	return retorno;
		
} 

Eu estaria tranquilo?

[quote=ibispo][quote=Carlos_ds_jar]
O ideal pra vc é utilizar um controle de transação pra evitar a inconsistencia do banco a acessos simultêneos
[/quote]

Você poderia me ajudar a entender melhor isso?. Hoje nas DAOs eu utilizo alguma coisa assim:

public boolean update( CadastroBean dadosCadastro ) {
		
	boolean retorno = true;
    	
    	try {

    		beginConnection();

        	connection.setAutoCommit(false);
    		
        	if ( dadosCadastro.getId() == 0 ) {
        	
	            sql = "INSERT INTO CadastroX " +
		              "( Nome, Endereco, ID ) " +
		              "VALUES " +
		              "( ?, ?, ? )";

        	} else {
        		
	            sql = "UPDATE CadastroX " +
		              "SET Nome = ?, Endereco = ?" +
		              "WHERE ID = ?";
        		
        	}
            
            pStmt = connection.prepareStatement(sql);

            pStmt.setString(1, dadosCadastro.getNome() );
            pStmt.setString(2, dadosCadastro.getEndereco() );
            pStmt.setInt(3, dadosCadastro.getId() );
            
            pStmt.executeUpdate();
            
            connection.commit();

        } catch (Exception e) {
        	retorno = setCatch(e);
	} finally {
        	setFinally();
        }
		
	return retorno;
		
} 

Eu estaria tranquilo?[/quote]
Provavelmente sim, mas recomendo utilizar JPA com Hibernate, pra controlar as transações, com isso sua aplicação fica no minimo mais confiável :idea:

Carlos, valeu as dicas!