Pergunta

Às vezes este fim de semana de nossos bancos de dados (11.1.0.7) começou a ter problemas ao acessar determinadas pastas em uma parte da rede através de Java. Eu ter reproduzido o problema usando uma pequena porção de java que não faz nada, mas criar um objeto de arquivo e tentar excluir o arquivo. De banco de dados Isso funciona para a exclusão de arquivos locais e exclusão de arquivos de rede em nosso \ zion \ dp \ share, mas não do nosso \ zion \ it \ share.

Temos outro banco de dados que é executado sob os mesmos usuários de domínio de conta que não tem problemas de exclusão de arquivos a partir desta localização. Também conectado como o mesmo usuário de domínio no servidor tendo problemas Eu posso correr o exterior java da Oracle e não têm problemas apagar arquivos. O usuário do domínio tem total controle sobre a pasta e conectado como o usuário que pode criar, modificar e apagar arquivos.

Se eu não ter concedido o meu usuário banco de dados Oracle as permissões apropriadas dbms_java eu ??recebo o erro java.security.AccessControlException apropriado. Depois que eu conceder a permissão os java corre para a conclusão, o falso comando DELETE retorna (nada excluído) eo arquivo não é excluído.

Eu abri um caso com a Oracle, mas parece que eles não estão indo para ajudar mais porque envolve os comandos do arquivo a ser executado a partir da camada de java, embora só é reprodutível do ambiente Oracle.

Test Code:

import java.io.*;               
import java.sql.*;                 
import java.util.*;             

public class Ajclass
{
   public static void ajprocedure(String pdfFileName) throws Exception
   {
      boolean result;
      try {
         System.out.println("Start!");

         File file = new File(pdfFileName);
         //result = file.delete();
         result = file.exists();
         if (result == true) 
           System.out.println("xxFile deleted.");
         else
           System.out.println("xxFile NOT deleted!");
         System.out.println("End!");
      } catch ( Exception e ) {
         throw(e);
      }         
   }
}

Outro código que eu encontrei recentemente estar falhando apenas contra esse compartilhamento e somente quando executado a partir dentro deste banco de dados:

import java.io.*;
import java.sql.*;

public class DirectoryListing
{
public static void getList(String directory) throws SQLException
   {
      File path = new File( directory );
      String[] list = path.list();
      String element;
      int CurrentFile;

      for(CurrentFile = 0; CurrentFile < list.length; CurrentFile++)
      {
        element = list[CurrentFile];
        #sql { INSERT INTO DIRECTORYLISTING (FILENAME) VALUES (:element) };
      }
   }
}
Foi útil?

Solução 5

O suporte do Oracle sugeriu reiniciar o servidor depois de olhar para os resultados de monitor do processo que está sendo executado no executável oráculo enquanto a operação / exist exclusão estava ocorrendo. Eles descobriram que a acção recebe um resultado de STATUS_USER_SESSION_DELETED (0xC0000203) do servidor remoto, o que significa que a comunicação entre o servidor local e remoto não estão funcionando corretamente em um nível janelas. Pretendemos reiniciar este fim de semana para ver se isso resolve o problema.

Outras dicas

Comandos correr contra o sistema operacional de dentro do banco de dados executado como a conta oracle. Então, você precisa conceder ler e escrever em \ zion \ it \ no nível OS para oracle, bem como conceder as permissões de Java no banco de dados.

É a exclusão de arquivos que você realmente quer fazer? Ou é apenas um teste? Porque podemos excluir os arquivos usando o procedimento PL / SQL UTL_FILE.FREMOVE () .

Se você tiver permissões oráculo de administração, verifique o (outro servidor de domínio) nome remoto servidor host ea porta está disponível sob a Oracle lista Ouvintes ?? (Usando o Oracle NetManager) e também verificar listener.ora arquivo ..

"mas criar um objeto de arquivo e tentar apagar o arquivo" você pode determinar se a exclusão falhar porque a) Não pode encontrar o arquivo Algo estranho no nome do arquivo b) O ficheiro está bloqueado / aberto por outro processo Poderia haver algo olhando para aquela ação (replicação, backup, verificação de vírus) c) Permissão insuficiente

Quais são os sistemas de arquivos subjacentes?

Como cerca de postar todo o pedaço de código. Outro fórum sugere que você pode não ser capaz de usar a mesma filehandle. "Mas eu estaria disposto a apostar que você está tentando excluir o arquivo com base na variável 'pega' do FileOutputStream Se for esse o caso, você não pode;., Você precisa criar um objeto de arquivo usando o nome do arquivo usado ao criar o FileOutputStream, e depois excluir () que. "

O fato de que ele funciona em alguns casos pode ser 'sorte' ao invés de comportamento documentado.

PS. usando o método de exclusão de um href="http://java.sun.com/docs/books/tutorial/essential/io/delete.html" rel="nofollow caminho em vez de arquivo parece um fracasso será mais informativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top