[problema] Servlet fazendo fila de download

Boa noite a todos, é o seguinte, eu fiz um servlet que libera download de arquivos mais com a banda limitada, mais o problema é que se eu tentar fazer download no mesmo navegador de qualquer arquivo o servlet fica fazendo uma espécie de fila que enquanto o download for cancelado ou terminado não é liberado o próximo download.

segue o meu código:

//consulta no banco para pegar o arquivo (é um campo OID)
                Statement stmt = Conexao.getInstance().getConnection().createStatement();
                ResultSet rs = stmt.executeQuery("SELECT arq_dados, arq_nome FROM arquivo a  WHERE a.arq_cod = " + arq);

                if (rs.next()) {

//pega o oid
                    int oid = rs.getInt("arq_dados");
//carrega ele
                    LargeObjectManager lom = ((org.postgresql.PGConnection) (Conexao.getInstance().getConnection())).getLargeObjectAPI();

                    LargeObject lo = lom.open(oid, LargeObjectManager.READ);

//cria o header
                    response.setHeader("Content-Disposition", "attachment; filename = " + rs.getString("arq_nome"));
                    response.setContentType("octet-stream");

//le o arquivo e passa para o buffer
                    byte[] buffer = lo.read(lo.size());

//fecha as conexoes, exceto a conexão com o banco, pq eu fiz um singleton
                    lo.close();
                    rs.close();
                    stmt.close();
                    
/define o tamanho
                    response.setContentLength(buffer.length);

//verifica, se o arquivo for maior q 50Kb ele limita a velocidade, senão manda eletodo

                    if (buffer.length >= 50000) {

                        for (int count = 0; count <= buffer.length / 50000; count++) {
                            out.write(buffer, count, 50000);
                            response.flushBuffer();
//aqui ja tem um catch por fora, não é erro aqui não
                            Thread.sleep(1000);
                        }

                    } else {
                        out.write(buffer);
                        out.flush();
                    }

então meus colegas, se algué puder me ajudar a resolver esse problema de fila de download e fazer com que a cada acesso a esse servlet ele libere o download imediatamente.

obrigado a todos, esperando a ajuda de vcs :smiley:

Eu já vi esse erro, mas não é nada do seu código, se você tentar fazer 10 downloads ao mesmo tempo em qualquer um dos seus navegadores, ele vai esperar e ir iniciando os ultimos aos poucos, creio que a própria rede faz esse balanceamento para não ficar com conexão super limitada. Quando em casa alteramos a conexão e 2mb para 15mb eu consegui fazer até 13 downloads ao mesmo tempo, desconsiderando torrents e gerenciadores.

É natural que haja enfileiramento, afinal de contas você tem várias thread acessando uma conexão com o banco de dados. O que você tem que fazer é abrir uma conexão para cada thread. Se for o caso, utiliza um pool de conexões, existem várias implementações prontas.

Além do mais, esse controle de banda é desnecessário, o protocolo TCP já faz isso por você.

valeu pela dica, quando eu chegar em casa vou tentar abrir um conexão para cada download, mais é o seguinte, eu estou fazendo um servidor de compartilhamento de arquivos tipo 4Shared, mediafire, etc. no meu tcc, por isso q eu estou fazendo a limitação de banda, e tipo, eu naum estou fazendo 10 downloads simultaneamente para ele enfileirar, é so ter 1 ao menos sendo baixado q ele faz a fila.

mais valeu pelas dicas, vou tentar mais tarde, e posto o resultado.

e aí gente, pois é, tentei criar uma conexão separada mais não funcionou, segue meu código agora.


                Class.forName("org.postgresql.Driver");

                Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/ourcloud", "usuario", "senha");
                con.setAutoCommit(false);
                
                Statement stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT arq_dados, arq_nome FROM"
                        + " arquivo a "
                        + " inner join usuario_arquivo ua on ua.arq_cod = a.arq_cod "
                        + " inner join usuario u on u.usu_cod = ua.usu_cod "
                        + " WHERE "
                        + " u.usu_cod = " + usr + " and a.arq_cod = " + arq);

                if (rs.next()) {


                    int oid = rs.getInt("arq_dados");
                    LargeObjectManager lom = ((org.postgresql.PGConnection) (con)).getLargeObjectAPI();

                    LargeObject lo = lom.open(oid, LargeObjectManager.READ);
                    response.reset();
                    response.resetBuffer();
                    response.setHeader("Content-Disposition", "attachment; filename = " + rs.getString("arq_nome"));
                    response.setContentType("octet-stream");


                    byte[] buffer = lo.read(lo.size());

                    lo.close();
                    rs.close();
                    stmt.close();
                    con.close();

                    response.setContentLength(buffer.length);


                    if (buffer.length >= 50000) {
                        for (int count = 0; count <= buffer.length / 50000; count++) {
                            out.write(buffer, count*50000, 50000);
                            response.flushBuffer();
                            Thread.sleep(1000);
                        }
                    } else {
                        out.write(buffer);
                        out.flush();
                    }
                    
                    out.close();

                }

se tiverem mais alguma ideia sem ser pool, pq tipo, pool eu teria q limitar a quantidade de conexões simultaneas, e não é essa a minha intensão.

valeu a tds

Ninguém?