Каково поведение параметра isReadOnly JDB C при использовании PostgreSQL? - PullRequest
4 голосов
/ 11 марта 2020

Класс соединения Java JDB C позволяет установить параметр readOnly, но для чего он используется?

В соответствии с JDB C документацией :

readOnly используется для перевода соединения в режим только для чтения.

Согласно Документация HikariCP :

Это свойство управляет находятся ли соединения, полученные из пула, в режиме только для чтения по умолчанию. Обратите внимание, что некоторые базы данных не поддерживают концепцию режима «только чтение», в то время как другие обеспечивают оптимизацию запросов, когда для параметра «Соединение» выбран режим «только чтение». Нужно ли вам это свойство или нет, во многом будет зависеть от вашего приложения и базы данных. По умолчанию: false

Но что такое соединение в режиме только для чтения? Что это за концепция? Соединение, которое допускает только операторы SELECT?

Предоставляет ли соединение только для чтения какие-либо преимущества с драйвером PostgreSQL JDB C?

1 Ответ

3 голосов
/ 12 марта 2020

Вы можете просмотреть PostgreSQL JDB C драйвер на github . Реализация Connection.setReadOnly указывает, что при вызове этого метода в базу данных отправляется один из следующих SQL операторов:

SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY

или

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Теперь, если мы будем читать PostgreSQL ссылка , это указывает:

Режим доступа к транзакции определяет, будет ли транзакция доступной только для чтения / записи или только для чтения. Чтение / запись по умолчанию. Когда транзакция доступна только для чтения, следующие команды SQL запрещены: INSERT, UPDATE, DELETE и COPY FROM, если таблица, в которую они будут записывать, не является временной таблицей; все команды CREATE, ALTER и DROP; КОММЕНТАРИЙ, ГРАНТ, ОТЗЫВ, ТРАНСКАТ; и EXPLAIN ANALYZE и EXECUTE, если команда, которую они будут выполнять, входит в число перечисленных. Это высокоуровневое понятие «только для чтения», которое не предотвращает все записи на диск.

Таким образом, основное преимущество заключается в том, что вы не сможете случайно изменить данные. Это похоже на использование Collections.unmodifiableList и, как правило, приводит к более устойчивому коду, поэтому, если вы уверены, что данная транзакция предназначена только для чтения, используйте это свойство.

...