Sincronização

5 respostas
J

Olá galera,

To com um problema que eh o seguinte:

Existe um formulario que envia dados e arquivos para uma servlet.

Esta recebe o arquivo e salva outras informacoes num banco oracle.

So que esta dando problema quando varios usuarios tentam enviar arquivos ao mesmo tempo (somente alguns arquivos são salvos e o browser “congela” (sic M$).

Como garantir que os dados e os arquivos serão salvos (obviamente precisaria de um Thread ou coisa parecida).

A classe (que foi feita por um terceiro) implmenta o SingleThreadModel do pacote de servlets, mas parece que isso não está sendo suficiente para garantir a integridade dos dados enviados.

Valeu a força

[]s

5 Respostas

Paulo_Silveira

Olá

Primeiro, o SingleThreadModel faz você perder bastante eficiência, mas garante que não mais que uma Thread vai estar acessando o mesmo service daquela servlet ao mesmo tempo.

Só que isso não impede um monte de coisas: se a sua servlet está usando atributos estáticos, com certeza eles estão sendo mexidos ao mesmo tempo.

Se você mexe no mesmo arquivo temporário para todos os usuários, pode ser que tenha duas instâncias daquelas servlet acessando esse arquivo ao mesmo tempo.

Pense em todos os recursos que a sua servlet está usando, e escreva aqui.

Melhor: poe o código fonte! Ai resolve rapidão!

J
// Decompiled by DJ v3.2.2.67 Copyright 2002 Atanas Neshkov  Date: 24/9/2002 16:39:43
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3)
// Source File Name:   SendFile.java

package com.estrategia.uvb.servlet.gallery;

import com.estrategia.uvb.util.db.Database;
import com.estrategia.uvb.util.db.UpdateSet;
import com.estrategia.uvb.util.html.HTMLBuilder;
import com.oreilly.servlet.MultipartRequest;
import com.uvb.lms.log.Acesso;
import java.io.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.tools.DateTool;
import javax.tools.TimeTool;

public class SendFile extends HttpServlet
    implements SingleThreadModel
{

    public SendFile()
    {
    }

    public void init(ServletConfig servletconfig)
        throws ServletException
    {
        super.init(servletconfig);
    }

    public void doPost(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
        throws IOException, ServletException
    {
        PrintWriter printwriter = null;
        Object obj = null;
        Object obj1 = null;
        Object obj2 = null;
        Object obj3 = null;
        Object obj4 = null;
        Object obj5 = null;
        Object obj6 = null;
        Object obj7 = null;
        Object obj8 = null;
        httpservletresponse.setContentType("text/html");
        printwriter = new PrintWriter(httpservletresponse.getOutputStream());
        printwriter.println("<html>");
        printwriter.println("");
        printwriter.println("<head>");
        printwriter.println("<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">");
        printwriter.println("<title>Galeria</title>");
        printwriter.println("</head>");
        printwriter.println("<body>");
        try
        {
            HttpSession httpsession = httpservletrequest.getSession(true);
            Date date = new Date();
            String s1 = String.valueOf(String.valueOf((new StringBuffer(String.valueOf(String.valueOf(date.getDate())))).append("/").append(date.getMonth() + 1).append("/").append(date.getYear() + 1900)));
            MultipartRequest multipartrequest = new MultipartRequest(httpservletrequest, "/usr/local/uvb2/pages/security/download/gallery/");
            if(multipartrequest.getFile("attach") != null && multipartrequest.getFile("attach").length() >= (long)0x7d000)
            {
                httpservletresponse.sendRedirect(String.valueOf(String.valueOf((new StringBuffer("/")).append(httpsession.getValue("versao1.idioma")).append("/galeria/erroTamanho.jsp"))));
            }
            else
            {
                String s = (String)httpsession.getValue("classroomID");
                Database database = new Database();
                database.connect();
                String s3 = database.generatorID("gallery_id");
                UpdateSet updateset = database.updateSet("gallery");
                updateset.insert();
                updateset.setField("gallery_id", s3);
                updateset.setField("classroom_id", s);
                updateset.setField("unit_id", multipartrequest.getParameter("unit_id"));
                updateset.setField("title", HTMLBuilder.characters(multipartrequest.getParameter("title")));
                updateset.setField("summary", HTMLBuilder.characters(multipartrequest.getParameter("summary")));
                if(multipartrequest.getFile("attach") != null)
                {
                    String s2 = String.valueOf(String.valueOf((new StringBuffer("[")).append(s3).append("]").append(HTMLBuilder.simplify(multipartrequest.getFilesystemName("attach")))));
                    multipartrequest.getFile("attach").renameTo(new File("/usr/local/uvb2/pages/security/download/gallery/", s2));
                    updateset.setField("attach_virtual", "/security/download/gallery/".concat(String.valueOf(String.valueOf(s2))));
                    updateset.setField("attach_real", "/usr/local/uvb2/pages/security/download/gallery/".concat(String.valueOf(String.valueOf(s2))));
                }
                updateset.setField("date_creation", s1);
                updateset.setField("author", (String)httpsession.getValue("userName"));
                updateset.applyInsert();
                database.executeQuery(String.valueOf(String.valueOf((new StringBuffer("update gallery set user_id=")).append(httpsession.getAttribute("userID")).append(", user_type='").append(httpsession.getAttribute("typeUser").toString().substring(0, 1).toUpperCase()).append("', dt_inclusion = to_date('").append(DateTool.getDate(DateTool.getDate().getTime(), true)).append(" ").append(TimeTool.getTime()).append("', 'dd/mm/yyyy hh24:mi:ss') where gallery_id=").append(s3))));
                database.disconnect();
                Acesso.gravarAcesso("2-3", "gallery_id=".concat(String.valueOf(String.valueOf(s3))), String.valueOf(String.valueOf((new StringBuffer("T315TULO: ")).append(HTMLBuilder.characters(multipartrequest.getParameter("title"))).append("
TEXTO: ").append(HTMLBuilder.characters(multipartrequest.getParameter("summary"))))), httpsession);
                httpservletresponse.sendRedirect(String.valueOf(String.valueOf((new StringBuffer("/")).append(httpsession.getValue("versao1.idioma")).append("/galeria/confirmaEnvio.jsp"))));
            }
        }
        catch(Exception exception)
        {
            exception.printStackTrace(printwriter);
        }
        printwriter.println("</body>");
        printwriter.println("</html>");
        printwriter.close();
    }
}

PS: Não estou roubando classes de ninguém Ok??? Tá dando pau e o (meu) cliente pediu pra arrumar. Como não tinha os fontes… DJ neles.

Valeu a força Paulo

[]s

Paulo_Silveira

Pelo que vi, a servlet está usando o cos.jar da Oreilly.

Você está tendo problemas quando vários arquivos são uploadados concorrentemente, é isso?

Preciso ver se na cos.jar tem algo static que eles compartilham. Com isso nem o SingleThreadModel iria salvar!

PROVAVEL PROBLEMA: O SingleThreadModel faz com que apenas um request seja processado por servlet por vez, entao, pode ser que quando duas pessoas tentam uplaodar, nao eh que o browser de uma congela, eh que o outro aiinda esta uploadando, e o outro fica esperando pra adiquirir o lock. Voce fez o teste com arquivos de que tamanho? voce esperou um bom tempo pra ver o resultado?

Faca um teste: tire o SingleThreadModel. Acho que resolve.

A propósito,d esculpe falar, mas esse código está horrível! Sem métrica nenhuma! Nomeclatura ruim, impressão de html direto da servlet!

J

Oi veim (sotaque mineiro galera),

Não vou nem comentar sua resposta. Acertou na mosca.

Jamais ia pensar nisso…

Realmente, o código é um LIXO… Mas estou faturando um $$$ em cima dessa porcaria.

O sistema dos caras num parece nem pizza…

Static void addCalabreza() :slight_smile:

Quem sabe ate nao rende coisa nova $$$$$$$$$$$$$$$…

Mas o grupo e de qualidade acima de qualquer suspeita…

Valeu Paulo

To devendo pra galera…

Tem um negocim (mei feim ainda) que vou postar pra ver a repercussao.

Grande abraco

J

So pra esclarecer os mano… (sotaque paulista…)

O codigo eh de terceiro :!: …

big hugs

Criado 24 de setembro de 2002
Ultima resposta 26 de set. de 2002
Respostas 5
Participantes 2