Да, по принцип трябва да създадете нова връзка за всяка нишка. Нямате контрол върху начина, по който операционната система разделя изпълнението на нишките (независимо от дефинирането на вашите собствени критични секции), така че може по невнимание да имате множество нишки, които се опитват да изпратят данни по тази една тръба.
Обърнете внимание, че същото важи за всички мрежови комуникации. Ако сте имали две нишки, опитващи се да споделят един сокет с HTTP връзка, например.
- Нишка 1 прави заявка
- Нишка 2 прави заявка
- Нишка 1 чете байтове от сокета, като несъзнателно прочита отговора от заявката на нишка 2
Ако сте обвили всичките си транзакции в критични секции и следователно сте заключили всички други нишки за цял цикъл начало/комитиране, тогава може да сте в състояние да споделяте връзка с база данни между нишките. Но не бих направил това дори тогава, освен ако наистина нямате вродени познания за протокола JDBC.
Ако повечето от вашите нишки рядко се нуждаят от връзки към базата данни (или изобщо нямат нужда), може да сте в състояние да посочите една нишка, която да върши работата ви с базата данни, и да накарате други нишки да поставят своите заявки в опашка към тази нишка. Това би намалило разходите за толкова много връзки. Но ще трябва да разберете как да управлявате връзките за нишка във вашата среда (или да зададете друг конкретен въпрос за това в StackOverflow).
актуализация: За да отговоря на въпроса ви в коментара, повечето марки бази данни не поддържат множество едновременни транзакции на една връзка (InterBase/Firebird е единственото изключение, за което знам).
Би било хубаво да имате отделен обект за транзакции и да можете да стартирате и извършвате множество транзакции на връзка. Но продавачите просто не го поддържат.
По същия начин стандартните API, независими от доставчика, като JDBC и ODBC, правят същото предположение, че състоянието на транзакцията е просто свойство на обекта за връзка.