- •Работа с базами данных JDBC
- •JDBC
- •Типы драйверов JDBC
- •Соединение с БД
- •URL соединения
- •Выполнение выражений
- •Выполнение запросов
- •Добавление данных в таблицу
- •Обработка ошибок (SQLException)
- •Предупреждения (SQLWarning)
- •Категоризация исключений
- •ResultSet
- •Получение значений из ResultSet
- •Авто-коммит
- •Пакетные (batch) операции
- •Подготовленные выражения
- •Пакетные поготовленные выражения
- •Statement и PreparedStatement
- •Транзакции
- •Точки сохранения (Savepoint)
- •Освобождение точки сохранений
- •Ситуации с параллельным использованием БД
- •Уровни изоляций транзакций
- •Использование большого количества данных
Освобождение точки сохранений
Вызов conn.releaseSavepoint(savepoint) убирает точку сохранения из транзакции
Возврат к освобожденной точке сохранения вызовет исключение SQLException
Возврат к точке сохранения автоматически освободит все точки сохранения, созданные после неё.
Ситуации с параллельным использованием БД
«Неподтвержденное чтение» - когда транзакция A видит данные, добавленные/измененные транзакцией Б, но не был вызван commit
Повторенные чтения — когда в процессе чтения данных транзакцией А, транзакция Б обновляет её. Транзакция А прочитает измененную строку дважды, с изменениями, сделанными Б.
Фантомы — когда в процессе вычитывания транзакцией А данных, транзакция А или Б добавляет/изменяет строку, чтобы она попала под условия выборки в транзакции А. Когда транзакция А повторно выберет данные, у нее появится лишняя строка.
Уровни изоляций транзакций
Уровень |
Неподтвержден- |
Повторные |
Фантомы |
|
ное чтение |
чтения |
|
TRANSACTION_READ_COMMITTED |
Запрещено |
допускается |
допускается |
TRANSACTION_READ_UNCOMMITTE |
допускается |
допускается |
допускается |
D |
|
|
|
TRANSACTION_REPEATABLE_READ |
Запрещено |
Запрещено |
допускается |
TRANSACTION_SERIALIZABLE |
Запрещено |
Запрещено |
Запрещено |
conn.setTransactionIsolation(int level) int conn.getTransactionIsolation()
Использование большого количества данных
Типы BLOB, CLOB и NCLOB позволяют хранить потенциально большие данные.
Clob myClob = conn.createClob();
Writer clobWriter = myClob.setCharacterStream(1); clobWriter.write(...); // и т.д.
...
pstmt.setClob(2, myClob);
Чтение из CLOB
Clob resClob = rs.getClob(2);
Reader clobReader = resClob.getCharacterInputStream();