joined_document
.pdfОсвобождение ресурсов
resultSet.close();
statement.close();
connection.close();
Транзакции
Атомарность
Согласованность
Изолированность
Долговечность
10
Транзакции
connection.setAutoCommit(false);
connection.commit();
connection.rollback();
Транзакции
Lost update
двойное обновление в параллельных транзакциях
Dirty reads
чтение уже измененных данных
Nonrepeatable reads
при повторном чтении строки изменяются или удаляются
Phantom reads
при повторном чтении строки добавляются
11
Транзакции
connection.
getTransactionIsolation();
connection.
setTransactionIsolation();
Транзакции
TRANSACTION_NONE
TRANSACTION_READ_UNCOMMITED
TRANSACTION_READ_COMMITED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZEABLE
12
Транзакции
Уровень |
Phantom |
Non- |
Dirty reads |
Lost update |
reads |
repeatable |
|
|
|
изоляции |
|
|
||
|
reads |
|
|
|
|
|
|
|
|
SERIALIZEABLE |
|
|
|
|
|
|
|
|
|
REPEATABLE |
|
|
|
|
READ |
|
|
|
|
|
|
|
|
|
READ |
|
|
|
|
COMMITED |
|
|
|
|
|
|
|
|
|
READ |
|
|
|
|
UNCOMMITED |
|
|
|
|
|
|
|
|
|
13
Пул соединений
Особенности выполнения подключения к СУБД
Open |
Transaction |
Close |
Connection |
|
Connection |
1
Особенности Connection Pool-а
Connection connection =
DriverManager.getConnection(
"jdbc:mysql://localhost/library",
"root",
"root"
);
Особенности Connection Pool-а
Работа с СУБД от имени одного пользователя
Работа только с одной СУБД и одной БД в ней
2
Плюсы Connection Pool-а
Сокращение времени получения экземпляра класса Connection
Возможность централизованно управлять всеми соединениями
Упрощение рутинных операций с соединениями (например, закрытие
STATEMENT-ов и RESULTSET-ов)
Минусы Connection Pool-а
Хранение непригодных (закрытых) соединение или дополнительная
нагрузка по контролю пригодности соединений
Проблемы с безопасностью
Трудности в реализации асинхронной работы с СУБД
3
Пример реализации
final public class ConnectionPool { private static ConnectionPool instance =
new ConnectionPool();
private ConnectionPool() {}
public static ConnectionPool getInstance() { return instance;
}
/* ... */
}
Пример реализации
final public class ConnectionPool {
/* ... */
private BlockingQueue<Connection> connections = new LinkedBlockingQueue<Connection>();
public Connection getConnection()
throws DataException {
}
public void freeConnection(Connection c) {
}
}
4
Альтернатива реализации
final public class ConnectionPool { private static BlockingQueue<Connection>
connections = new LinkedBlockingQueue<Connection>();
private ConnectionPool() {}
public static Connection getConnection()
throws DataException {
}
public static void freeConnection(Connection c) {
}
}
Пример реализации
public Connection getConnection() throws DataException { Connection c = null;
while(c == null) { try {
/* ... */
} catch(SQLExcepton e) {
throw new DataException(e); } catch(InterruptedException e) { throw new DataException(e);
}
}
}
5
Пример реализации
if(!connections.isEmpty()) {
c= connections.take(); if(!c.isValid(0)) {
c = null;
}
}else {
c= DriverManager.getConnection(
"jdbc:mysql://localhost/library", "root", "root"
);
}
Пример реализации
if(!connections.isEmpty()) { c = connections.take(); if(!c.isValid(0)) {
c = null;
}
} else {
/* Class.forName("com.mysql.jdbc.Driver"); */ c = DriverManager.getConnection(
"jdbc:mysql://localhost/library", "root", "root"
);
}
6