Christian H. Kuhn
2017-09-06 16:29:33 UTC
Hallo Gemeinde,
Ich dachte, ich hätte das mit der Thread-Sicherheit inzwischen
verstanden. PMD widerspricht mir.
final class QFdsbDatabase {
private static volatile Connection connection;
private static final String DATABASE = "database";
/**
* Private constructor to avoid instantiation.
*/
private QFdsbDatabase() {
// empty
}
/**
* Creates a Connection to a FIDE/DSB database and stores it in a
static field for use. Access data is given by an
* ini4j ini file.
*
* @return Connection to a FIDE/DSB database.
* @throws QFdsbException
* Exception
*/
static Connection getConnection() throws QFdsbException {
if (null == connection) {
synchronized (connection) {
if (null == connection) {
[... Daten aus ini4j-File, dataSource erstellen ... ]
try (Connection myConnection =
dataSource.getConnection()) {
myConnection.setAutoCommit(true);
connection = myConnection;
} catch (SQLException e) {
throw new QFdsbException("Problems while opening
or closing JDBC Connection to player database",
e);
}
}
}
}
return connection;
}
}
Lazy initialization der statischen Variablen, weil ich die geworfenen
Exceptions sehen will, sonst hätte ich einen static block genommen. Mit
einem intitialization-on-demand holder vertage ich das Problem in eine
Unterklasse. Double-checked locking sollte funktionieren, PMD behauptet
das Gegenteil.
Andere Frage: Wird die Connection nicht am Ende schon durch den
impliziten finally-Block geschlossen, bevor sie ausgeliefert wird?
TIA
QNo
Ich dachte, ich hätte das mit der Thread-Sicherheit inzwischen
verstanden. PMD widerspricht mir.
final class QFdsbDatabase {
private static volatile Connection connection;
private static final String DATABASE = "database";
/**
* Private constructor to avoid instantiation.
*/
private QFdsbDatabase() {
// empty
}
/**
* Creates a Connection to a FIDE/DSB database and stores it in a
static field for use. Access data is given by an
* ini4j ini file.
*
* @return Connection to a FIDE/DSB database.
* @throws QFdsbException
* Exception
*/
static Connection getConnection() throws QFdsbException {
if (null == connection) {
synchronized (connection) {
if (null == connection) {
[... Daten aus ini4j-File, dataSource erstellen ... ]
try (Connection myConnection =
dataSource.getConnection()) {
myConnection.setAutoCommit(true);
connection = myConnection;
} catch (SQLException e) {
throw new QFdsbException("Problems while opening
or closing JDBC Connection to player database",
e);
}
}
}
}
return connection;
}
}
Lazy initialization der statischen Variablen, weil ich die geworfenen
Exceptions sehen will, sonst hätte ich einen static block genommen. Mit
einem intitialization-on-demand holder vertage ich das Problem in eine
Unterklasse. Double-checked locking sollte funktionieren, PMD behauptet
das Gegenteil.
Andere Frage: Wird die Connection nicht am Ende schon durch den
impliziten finally-Block geschlossen, bevor sie ausgeliefert wird?
TIA
QNo