Um objeto Connection normalmente não é thread-safe (você não é obrigado a implementar um driver JDBC como “thread-safe”), mas um colega meu descobriu isso da pior maneira possível:
Ele tinha um objeto Connection e resolveu compartilhá-lo entre duas threads para que um determinado serviço fosse efetuado mais rapidamente, já que tinha uma máquina dual-core. Primeiramente, testou o programa em uma máquina com um processador simples; e tudo funcionou maravilhosamente.
A seguir, foi testar o programa em uma máquina dual-core; aí começou a ter problemas muito esquisitos. (Como inserir um dado em uma tabela, e obter a contagem dos registros em outra thread, como se o dado não tivesse sido inserido).
Ele resolveu o problema dele com uma conexão separada para cada thread. Como o HSQLDB processa todas as conexões em uma única thread, não tem problemas em si (mas também não aproveita adequadamente os vários processadores); o problema é de seu driver JDBC.
Nem fez isso. Foi pelo método da força bruta (dentro da thread, criar a conexão, e deixá-la em uma variável local.).