Да, вам следует избегать создания нескольких соединений, поскольку ресурсы базы данных ограничены и должны использоваться с осторожностью.
Учитывая ваш вариант использования, я бы посоветовал не создавать соединение, а реорганизовать ваш код, чтобы улучшить управление соединениями.
Например, поскольку updateClob
является публичным методом, я предполагаю, что он может быть вызван из другого потока кода, поэтому в приведенном ниже фрагменте кода соединение инициализируется в этом методе, а фактическая работа выполняется private
методами, которые просто используют предоставленное им соединение и не создавайте новое.
Кроме того, они не закрывают передаваемое им соединение, они оставляют вызывающему соединение управление соединением, они просто закрывают все, что создают в этом случае PreparedStatement
.
Фрагмент кода:
private void getAndUpdateClob(Connection conn) throws Exception {
Clob clob = getClob(conn);
PreparedStatement pStmt = null;
try {
pStmt = conn.prepareStatement("UPDATE TEST SET REFERENCE = ? WHERE ID = ?");
pStmt.setLong(1, 1);
pStmt.setClob(2, clob);
pStmt.executeUpdate();
} catch (SQLException sqlExp) {
sqlExp.printStackTrace();
throw sqlExp;
} finally {
if (pStmt != null) {
pStmt.close();
}
}
}
private Clob getClob(Connection conn) throws Exception {
PreparedStatement pStmt = null;
try {
pStmt = conn.prepareStatement("SELECT REFERENCE FROM TEST WHERE ID = ? FOR UPDATE OF REFERENCE");
pStmt.setLong(1, 1);
ResultSet rset = pStmt.executeQuery();
while (rset.next()) {
Clob clob = rset.getClob(1);
Writer writer = clob.getCharacterOutputStream();
writer.write("string to be updated");
writer.flush();
writer.close();
return clob;
}
} catch (SQLException sqlExp) {
sqlExp.printStackTrace();
throw sqlExp;
} finally {
if (pStmt != null) {
pStmt.close();
}
}
return null;
}
public void updateClob() throws Exception {
Connection conn = null;
try {
conn = getConnection();
getAndUpdateClob(conn);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.close();
}
}
}