Eu não acho que fazer conexões de banco de dados thread-safe seja uma prática comum. Normalmente o que você quer é:
- Serialize o acesso a alguma parte de seu servlet, para que não haja mais de um servlet executando código por vez (por exemplo, implementando o
SingleThreadModel
interface). - Bloqueando uma tabela/página de tabela/linha específica para que você possa operar em alguma tupla específica (alterando o nível de isolamento do banco de dados).
- Usando o bloqueio otimista para detectar linhas modificadas em uma tabela (usando algum atributo de referência da tabela para verificar se a versão atual é a mesma da tabela).
AFAIK, o uso típico de
ThreadLocal<Connection>
é armazenar uma conexão de banco de dados exclusiva por thread, para que a mesma conexão possa ser usada em diferentes métodos em sua lógica de negócios sem a necessidade de passá-la como parâmetro a cada vez. Como a implementação de contêiner de servlet comum usa um encadeamento para atender a uma solicitação HTTP, duas solicitações diferentes garantem o uso de duas conexões de banco de dados diferentes.