Sim, em geral você precisa criar uma nova conexão para cada thread. Você não tem controle sobre como o sistema operacional divide a execução de threads (apesar de definir suas próprias seções críticas), então você pode inadvertidamente ter vários threads tentando enviar dados por esse canal.
Observe que o mesmo se aplica a qualquer comunicação de rede. Se você tivesse dois threads tentando compartilhar um soquete com uma conexão HTTP, por exemplo.
- O segmento 1 faz uma solicitação
- O segmento 2 faz uma solicitação
- A thread 1 lê bytes do soquete, lendo involuntariamente a resposta da solicitação da thread 2
Se você agrupar todas as suas transações em seções críticas e, portanto, bloquear quaisquer outros encadeamentos para um ciclo de início/confirmação completo, poderá compartilhar uma conexão de banco de dados entre os encadeamentos. Mas eu não faria isso mesmo assim, a menos que você realmente tenha conhecimento inato do protocolo JDBC.
Se a maioria de seus encadeamentos tiver necessidade infrequente de conexões de banco de dados (ou nenhuma necessidade), você poderá designar um encadeamento para fazer seu trabalho com o banco de dados e fazer com que outros encadeamentos enfileirarem suas solicitações para esse encadeamento. Isso reduziria a sobrecarga de tantas conexões. Mas você terá que descobrir como gerenciar conexões por thread em seu ambiente (ou fazer outra pergunta específica sobre isso no StackOverflow).
atualizar: Para responder à sua pergunta no comentário, a maioria das marcas de banco de dados não suporta várias transações simultâneas em uma única conexão (InterBase/Firebird é a única exceção que conheço).
Seria bom ter um objeto de transação separado e poder iniciar e confirmar várias transações por conexão. Mas os fornecedores simplesmente não o suportam.
Da mesma forma, APIs independentes de fornecedor padrão como JDBC e ODBC fazem a mesma suposição, que o estado da transação é meramente uma propriedade do objeto de conexão.