Upload de mais de um arquivo (Usando JDBC)

8 respostas
gujlecar

Bom dia pessoal, estou tendo problemas ao tentar fazer o upload de três arquivos para que sejam incluídos no banco de dados(ORACLE). Estou utilizando a conexão JDBC. Eu abro somente uma conexão JDBC para aramazenar os três arquivos no banco, e executo a partir do IF(abaixo), o procedimento 3 vezes. O método no qual ele insere no banco definitivamente é o mIncluiArquivos. Já percebi q o problema é q ele não consegue dar o commit pros 3 procedimentos seguidamente, mesmo abrindo e fechando a conexão nas 3 vezes em q vou inserir os arquivos. Alguém saberia me explicar?! Muito Obrigado desde já…

java.sql.Connection connection = aClsConexoes.getConexaoJDBC(); if(!shortname1.equals("")){ ClsParamBdArquivos aClsParamBdArquivos = new ClsParamBdArquivos(); aClsParamBdArquivos.setCodEmpr(aClsUsuarioWeb.getCodEmpr(0)); aClsParamBdArquivos.setCod(sCod); aClsParamBdArquivos.setOpcao("1"); aClsParamBdArquivos.setNomeArq(shortname1); aClsParamBdArquivos.setArquivo(sArquivo1); ClsArquivos aClsArquivos = new ClsArquivos(); aClsArquivos.mIncluiArquivos(aClsParamBdArquivos, connection);

8 Respostas

smota

O método que nos interessa é o mIncluiArquivos (nomezinho horrendo, esse m tá fazendo o que aí? :? )

Os arquivos vieram de onde, de um formulário Web?(com 3 campos FILE, correto?)

Nesse código que vc postou, você já salvou os arquivos no filesystem, certo? (acho que sim pq não tem nenhum stream por aí, só strings) …

T

Ahn, e o que faz essa rotina?
aClsArquivos.mIncluiArquivos()

(off-topic: deve ser algum cara viciado em “notação húngara” que inventou esse nome para o seu método “mIncluiArquivos”. É claro que isso é um método, porque é que tem de pôr a letra “m” para indicar que isso é um método? A notação húngara é perfeita para o C onde você pode escrever algo como aClsArquivos.mIncluiArquivos; e o compilador não reclama de você ter esquecido os parênteses, e concordo que é boa para o uso em programação de GUIs, onde é interessante pôr o nome de btnOK para uma variável JButton que representa o botão OK, mas não é a tradição Java.)

EDITADO - Agora estou vendo, a notação húngara infestou o seu programa; na tradição Java nunca se põe “Cls” alguma coisa para indicar que o identificador representa uma classe. É suficiente que a primeira letra seja maiúscula.

gujlecar

Isso aí smota. Os três arquivos vêm de uma página JSP do tipo <input=“file”>. Guardo-os num tipo FileItem (estou usando o pacote org.apache.commons.fileupload.FileItem) - e depois insiro-os no banco com o método mIncluiArquivos. Já tentei colocar akele setAutoCommit(false); mas qnd resolvo dar o commit(); ele dá erro. Se eu não usar o setAutoCommit(false);, ele vai commitando a cada vez q ele chama o método mIncluiArquivos, porém, já na segunda execução desse método, dá erro, e acho q provavelmente deve ser o commit();

Valeu!

smota

Mostra o danado do erro, senão não dá pra adivinhar … mensagem e stacktrace.

Fora isso, se não puder colocar o código do método m^^($%@##% põe pelo menos um pseudo-código.

gujlecar

Esse é o erro no printStackTrace:

[24/02/05 10:14:09:114 GMT-03:00] 74e774e7 ConnectionEve A J2CA0056I: O Gerenciador de Conexões recebeu um erro de conexão fatal do Adaptador de Recursos para o recurso jdbc/thinORADE.  A exceção que foi recebida é com.ibm.websphere.ce.cm.StaleConnectionException: Exceção de E/S: Connection aborted by peer: socket write error
[24/02/05 10:14:36:971 GMT-03:00] 74e774e7 SystemOut     O Não existe conexão de banco de dados ativa para o comando.
[24/02/05 10:14:42:533 GMT-03:00] 74e774e7 WebGroup      I SRVE0180I: [RoyalWeb] [/] [Servlet.LOG]: /html/jsp/aviso.jsp: init
[24/02/05 10:14:43:799 GMT-03:00] 74e774e7 StaleConnecti A CONM7007I: Mapeando a seguinte SQLException, com ErrorCode 17.002 e SQLState &lt;null&gt;, para uma StaleConnectionException: java.sql.SQLException: Exceção de E/S: Connection aborted by peer: socket write error
	at java.lang.Throwable.&lt;init&gt;(Throwable.java:54)
	at java.lang.Throwable.&lt;init&gt;(Throwable.java:68)
	at java.sql.SQLException.&lt;init&gt;(SQLException.java:51)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:169)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:211)
	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:324)
	at oracle.jdbc.driver.OracleConnection.rollback(OracleConnection.java:889)
	at com.ibm.ws.rsadapter.spi.WSRdbSpiLocalTransactionImpl.rollback(WSRdbSpiLocalTransactionImpl.java:368)
	at com.ibm.ejs.j2c.LocalTransactionWrapper.rollback(LocalTransactionWrapper.java:310)
	at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.cleanup(LocalTranCoordImpl.java:878)
	at com.ibm.ws.webcontainer.webapp.WebAppTransactionCollaborator.postInvoke(WebAppTransactionCollaborator.java:208)
	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:673)
	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:176)
	at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:79)
	at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:201)
	at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:71)
	at com.ibm.ws.webcontainer.cache.invocation.CacheableInvocationContext.invoke(CacheableInvocationContext.java:114)
	at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:186)
	at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:334)
	at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:56)
	at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:610)
	at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:431)
	at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:593)

[24/02/05 10:14:44:143 GMT-03:00] 74e774e7 LocalTransact E WLTC0016E: Falha ao concluir o Recurso jdbc/thinORADE. O rastreio da pilha de exceção é: javax.transaction.xa.XAException: rollback() received an Exception: com.ibm.ws.rsadapter.exceptions.DataStoreAdapterException: DSRA0080E: An exception was received by the Data Store Adapter. See original exception message: Exceção de E/S: Connection aborted by peer: socket write error.
	at java.lang.Throwable.&lt;init&gt;(Throwable.java:54)
	at java.lang.Throwable.&lt;init&gt;(Throwable.java:68)
	at javax.transaction.xa.XAException.&lt;init&gt;(XAException.java:44)
	at com.ibm.ejs.j2c.LocalTransactionWrapper.rollback(LocalTransactionWrapper.java:333)
	at com.ibm.ws.LocalTransaction.LocalTranCoordImpl.cleanup(LocalTranCoordImpl.java:878)
	at com.ibm.ws.webcontainer.webapp.WebAppTransactionCollaborator.postInvoke(WebAppTransactionCollaborator.java:208)
	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:673)
	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:176)
	at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:79)
	at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:201)
	at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:71)
	at com.ibm.ws.webcontainer.cache.invocation.CacheableInvocationContext.invoke(CacheableInvocationContext.java:114)
	at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:186)
	at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:334)
	at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:56)
	at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:610)
	at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:431)
	at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:593)
.
[24/02/05 10:14:44:174 GMT-03:00] 74e774e7 TraceNLS      u No message text associated with key InconsistentLocalTranException in bundle com.ibm.ejs.resources.seriousMessages
[24/02/05 10:14:44:174 GMT-03:00] 74e774e7 WebAppTransac E InconsistentLocalTranException

Aki são usadas 3 camadas. Essa é a mais importante, pois onde seto o PreparedStatement e o executo.

public void mIncluiArquivos(ClsParamBdArquivos aClsParamBdArquivos) throws Throwable {
		
		String sQuerySeqArq = ClsVtArquivos.selRecuperaSeqArquivo(aClsParamBdArquivos);
		PreparedStatement pstmtSeqArq = fieldConexaoJDBC.prepareStatement(sQuerySeqArq);
		ResultSet rs = pstmtSeqArq.executeQuery();
		rs.next();
		aClsParamBdArquivos.setSeqArq(rs.getString(1));
		
		String sQuery = ClsVtArquivos.insArquivos(aClsParamBdArquivos);
		PreparedStatement pstmt = fieldConexaoJDBC.prepareStatement(sQuery);
		pstmt.setString(1,aClsParamBdArquivos.getCodEmpr());
		pstmt.setLong(2, Long.parseLong(aClsParamBdArquivos.getCod()));
		pstmt.setInt(3,Integer.parseInt(aClsParamBdArquivos.getOpcao()));
		pstmt.setInt(4,Integer.parseInt(aClsParamBdArquivos.getSeqArq()));
		pstmt.setString(5,aClsParamBdArquivos.getNomeArq());
		pstmt.setBinaryStream(6,aClsParamBdArquivos.getArquivo().getInputStream(),(int)aClsParamBdArquivos.getArquivo().getSize());
		
		int rows = pstmt.executeUpdate();
	}
smota

Você não tá com algum problema na sua rede não? O segundo arquivo que vc está inserindo é muito grande ou coisa assim? (troque a ordem pra testar)

Nunca usei o FileUpload, então uma dúvida: a essa altura do campeonato os arquivos estão gravados no filesystem? Se não estiverem faça um teste rápido, grave-os no disco e veja se foram salvos corretamente.

vamos lá :slight_smile:

gujlecar

Desculpe, mas vou dar uma procurada e ver como faço para gravá-los no disco, pois sou iniciante e não tenho essa noção ainda… Se for simples e tiver como me passar, fico grato.

smota

Editou a tempo hein?

Dá uma lidinha aqui pra você entender como funciona e de quebra ter um código baba pra usar e testar: http://jakarta.apache.org/commons/fileupload/using.html

Criado 24 de fevereiro de 2005
Ultima resposta 24 de fev. de 2005
Respostas 8
Participantes 3