Я бы сделал шаг назад и глубоко пересмотрел бы дизайн. С какой стати вы хотели бы разделить одно и то же Statement
(и, следовательно, неявно также * Connection
) между двумя потоками?
Обычная практика JDBC заключается в том, что вы должны приобрести и закрыть Connection
, Statement
и ResultSet
в кратчайшем возможном объеме. То есть внутри того же самого метода блока. Вот основной пример:
public void update(List<Item> items) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = database.getConnection();
statement = connection.prepareStatement(sql);
for (Item item : items) {
statement.setObject(1, item.getSomething());
statement.addBatch();
}
statement.executeBatch();
} finally {
if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}
}
Если все, что вам нужно, это просто повысить производительность соединения, используйте пул соединений. Например C3P0 . Но, конечно, не разделяет дорогие ресурсы БД между потоками! Таким образом, вам также не нужно беспокоиться о безопасности потоков. Это деталь реализации.
О, если это еще не ясно: вы не улучшите производительность базы данных, поделившись одним и тем же оператором и соединением между несколькими потоками. Хуже того, он только замедлится, и вы столкнетесь с проблемами безопасности потоков как на стороне Java, так и на стороне базы данных.