Upload de mais de um arquivo (Usando JDBC)

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);

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) …

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.

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!

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.

Esse é o erro no printStackTrace:

[code][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 <null>, para uma StaleConnectionException: java.sql.SQLException: Exceção de E/S: Connection aborted by peer: socket write error
at java.lang.Throwable.<init>(Throwable.java:54)
at java.lang.Throwable.<init>(Throwable.java:68)
at java.sql.SQLException.<init>(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.<init>(Throwable.java:54)
at java.lang.Throwable.<init>(Throwable.java:68)
at javax.transaction.xa.XAException.<init>(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[/code]

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

[code] 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();
}[/code]

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:

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.

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