Como você determina se uma conexão JDBC foi recuperado de um JTA habilitado DataSource ou reto JDBC?

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu estou usando uma API fornecedor para obter uma conexão JDBC ao banco de dados do aplicativo. A API funciona quando executado no servidor de aplicativos ou quando rodando em modo stand-alone. Eu quero executar uma série de instruções SQL em uma única transação. Eu estou bem com eles ocorrendo no contexto da transação JTA se ele existir. No entanto, se isso não acontecer, então eu preciso usar os métodos de demarcação de transação JDBC. (Chamar esses métodos em uma conexão JDBC que está participando em uma transação JTA causa uma SQLException.)

Então eu preciso ser capaz de determinar se a conexão veio do JTA habilitado DataSource ou se é apenas uma conexão JDBC reta.

Existe uma maneira para a frente para fazer essa determinação?

Obrigado!

Foi útil?

Solução

Mesmo que seja reta JDBC, você pode ter uma transação JTA habilitado. Verificando a bandeira autoCommit não vai ajudar nesse sentido. Você pode estar em uma transação, distribuído ou não, com autoCommit conjunto para false. autoCommit conjunto para true iria dizer-lhe que você não está em uma transação distribuída, mas um valor de meios apenas falsas você não vai auto-commit ... poderia ser em qualquer tipo de transação.

Eu acho que você vai ter que chamar UserTransaction.getStatus () e verificar que não é igual a Status.NoTransaction (). Isso iria dizer-lhe se você estiver em uma transação JTA.

Outras dicas

O que thilo diz faz sentido.

Caso contrário, não tenho certeza de um caminho reto, mas vou dar-lhe uma maneira "hack"

escrever uma BAD SQL que você sabe que vai dar uma exceção DB. Isso resultará em um rastreamento de pilha. A partir do rastreamento de pilha, você pode descobrir se ele é um JTA derivado conexão ou não?

Você poderia tentar verificar bandeira autoCommit do Connection para ver se ele está em uma transação (independentemente de onde veio). (Aparentemente, ver a resposta aceita, isso não funciona muito bem, eu não estou excluindo esta resposta porque o seguinte continua de pé:.)

Mas eu acho que você deve realmente modificar seu API que depender de transações externas exclusivamente. Se você ainda quer apoiar planície JDBC, envolvê-la em uma API separada que só começa a transação.

Update: Apenas re-ler a pergunta e viu que você não está fornecendo uma API, mas quer usar uma conexão gerenciada por contêiner. Mas ainda assim, você pode simplesmente mandato (como parte dos requisitos do seu aplicativo) que JTA estar em vigor? Se não, você poderia fornecer uma opção de configuração para voltar a cair para operações geridas manualmente. Para um recurso tão crítico parece razoável exigir a configuração adequada (em oposição a tentar adivinhar o que seria apropriado).

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