Ya, secara umum Anda perlu membuat koneksi baru untuk setiap utas. Anda tidak memiliki kendali atas bagaimana sistem operasi membagi waktu eksekusi utas (terlepas dari menentukan bagian penting Anda sendiri), sehingga Anda dapat secara tidak sengaja memiliki beberapa utas yang mencoba mengirim data ke satu pipa itu.
Perhatikan hal yang sama berlaku untuk komunikasi jaringan apa pun. Jika Anda memiliki dua utas yang mencoba berbagi satu soket dengan koneksi HTTP, misalnya.
- Utas 1 membuat permintaan
- Utas 2 membuat permintaan
- Utas 1 membaca byte dari soket, tanpa disadari membaca respons dari permintaan utas 2
Jika Anda membungkus semua transaksi Anda di bagian penting, dan karena itu mengunci semua utas lainnya untuk seluruh siklus mulai/komit, maka Anda mungkin dapat berbagi koneksi database antar utas. Tapi saya tidak akan melakukannya, kecuali Anda benar-benar memiliki pengetahuan bawaan tentang protokol JDBC.
Jika sebagian besar utas Anda jarang membutuhkan koneksi database (atau tidak perlu sama sekali), Anda mungkin dapat menetapkan satu utas untuk melakukan pekerjaan basis data Anda, dan meminta utas lain mengantre permintaan mereka ke satu utas itu. Itu akan mengurangi overhead dari begitu banyak koneksi. Namun Anda harus mengetahui cara mengelola koneksi per utas di lingkungan Anda (atau ajukan pertanyaan spesifik lainnya tentang hal itu di StackOverflow).
perbarui: Untuk menjawab pertanyaan Anda di komentar, sebagian besar merek basis data tidak mendukung banyak transaksi bersamaan pada satu koneksi (InterBase/Firebird adalah satu-satunya pengecualian yang saya ketahui).
Akan menyenangkan untuk memiliki objek transaksi yang terpisah, dan untuk dapat memulai dan melakukan beberapa transaksi per koneksi. Tapi vendor tidak mendukungnya.
Demikian pula, API standar vendor-independen seperti JDBC dan ODBC membuat asumsi yang sama, bahwa status transaksi hanyalah properti dari objek koneksi.