Я делаю тестирование производительности СУБД.Я должен сделать это вручную для моей магистерской диссертации.У меня должно быть определенное количество потоков, каждый из которых открывает свое собственное JDBC-соединение с БД (пул соединений не является опцией) и фиксирует одинаковое количество одинаковых транзакций (каждый поток выполняет одну и ту же работу).Мое соединение открыто как ресурс в блоке try-with-resources
.Соединение должно оставаться открытым до конца области действия try-with-resources
, но иногда это происходит, а иногда нет.
try (Connection conn = getConn();
PreparedStatement simpleSelectStmt = conn
.prepareStatement(tcInstance.getQueryMap().get("SimpleSelect").getSimpleSelect())) {
setConnIsolation(conn);
long startTime = System.nanoTime();
singleThread.execute(new Runnable() {
@Override
public void run() {
for (int j = 0; j < tcInstance.getnT(); j++) {
try {
conn.setAutoCommit(false);
simpleSelectStmt.execute();
conn.commit();
} catch (Exception e) {
error++;
if (detectDeadlock(e.getMessage())) {
deadlock++;
System.out.println("Deadlock detected!");
} else {
e.printStackTrace();
}
try {
if (conn != null) {
conn.rollback();
}
} catch (SQLException e1) {
System.out.println("There was an error in rolling back the transaction.");
e1.printStackTrace();
}
}
if (j != (tcInstance.getnT() - 1)) {
try {
Thread.sleep(t);// ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
measureCPUusage(Thread.currentThread().getId());
singleThread.shutdown();
});
long endTime = System.nanoTime();
....doing some other measurements....
} catch (Exception e) {
System.err.println("Error");
}
Это метод getConn()
, используемый для получения соединения jdbc:
private Connection getConn() throws SQLException {
return DriverManager.getConnection(tcInstance.getJDBCurl(), tcInstance.getUser(), tcInstance.getPassword());
}
Я ожидал, что соединение будет открыто через весь блок try-with-resources, но тамСоединение закрыто исключениями на линиях conn.setAutoCommit(false);
и conn.rollback();