PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

JDBC:Мога ли да споделя връзка в многопоточно приложение и да се наслаждавам на приятни транзакции?

Да, по принцип трябва да създадете нова връзка за всяка нишка. Нямате контрол върху начина, по който операционната система разделя изпълнението на нишките (независимо от дефинирането на вашите собствени критични секции), така че може по невнимание да имате множество нишки, които се опитват да изпратят данни по тази една тръба.

Обърнете внимание, че същото важи за всички мрежови комуникации. Ако сте имали две нишки, опитващи се да споделят един сокет с HTTP връзка, например.

  • Нишка 1 прави заявка
  • Нишка 2 прави заявка
  • Нишка 1 чете байтове от сокета, като несъзнателно прочита отговора от заявката на нишка 2

Ако сте обвили всичките си транзакции в критични секции и следователно сте заключили всички други нишки за цял цикъл начало/комитиране, тогава може да сте в състояние да споделяте връзка с база данни между нишките. Но не бих направил това дори тогава, освен ако наистина нямате вродени познания за протокола JDBC.

Ако повечето от вашите нишки рядко се нуждаят от връзки към базата данни (или изобщо нямат нужда), може да сте в състояние да посочите една нишка, която да върши работата ви с базата данни, и да накарате други нишки да поставят своите заявки в опашка към тази нишка. Това би намалило разходите за толкова много връзки. Но ще трябва да разберете как да управлявате връзките за нишка във вашата среда (или да зададете друг конкретен въпрос за това в StackOverflow).

актуализация: За да отговоря на въпроса ви в коментара, повечето марки бази данни не поддържат множество едновременни транзакции на една връзка (InterBase/Firebird е единственото изключение, за което знам).

Би било хубаво да имате отделен обект за транзакции и да можете да стартирате и извършвате множество транзакции на връзка. Но продавачите просто не го поддържат.

По същия начин стандартните API, независими от доставчика, като JDBC и ODBC, правят същото предположение, че състоянието на транзакцията е просто свойство на обекта за връзка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres не използва индекс на целочислен масив, ако е инсталирано разширение intarray

  2. PGError:Грешка:колона от релация не съществува

  3. django.db.utils.ProgrammingError:връзката bot_trade не съществува

  4. PostgreSQL UPDATE замяна на подниз

  5. Сравнение на дати в PostgreSQL