Подтвердить что ты не робот

Повторное использование объекта Java-заявления?

Я хотел бы знать, можем ли мы повторно использовать один и тот же объект Statement для выполнения нескольких запросов. Или мы должны создать новый оператор для разных запросов.

Например,

Connection con = getDBConnection();
Statement st1 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
int i = st1.executeUpdate("update tbl_domu set domU_status=1 where domU_id=" + dom_U_id);
Statement st2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime());
int j = st2.executeUpdate("insert into tbl_domU_action_history values('" + dom_U_name + "', 1, '" + date + "')");  

В приведенном выше случае существует ли какой-либо вред в использовании одного и того же оператора st1 для запросов executeUpdate()? Можно ли использовать один и тот же объект Statement st1 для другого executeQuery()?

4b9b3361

Ответ 1

Я наткнулся на ответ, который я искал в Javadocs

По умолчанию только один объект ResultSet для объекта Statement может быть открыт одновременно. Поэтому, если чтение одного объекта ResultSet чередуется с чтением другого, каждый из них должен быть сгенерирован различными объектами Statement.

Ответ 2

Да, вы можете. Тем не менее, гораздо лучше использовать PreparedStatement, чтобы избежать уязвимостей SQL-инъекций.

Ответ 3

Исходная точка использования подготовленных операторов заключалась в том, чтобы избежать разбора базы данных и перекомпилировать оператор, поэтому он должен быть быстрее.

Я не рассматривал уязвимости SQL-инъекций, но я не уверен, что, если какая-либо проверка данных будет выполнена. Я подозреваю, что он зависит от драйвера, так как реализация драйвера позволяет просто склеить утверждения вместе. Если у кого-то есть подробности, отправьте сообщение.

Ответ 4

Я не уверен, что наборы результатов получат сбор мусора, если только они только закрыты. Я думаю, что у меня была прохладная утечка памяти, когда я писал пул соединений, поэтому одно и то же выражение/соединение было повторно использовано миллион раз. Удержал мою JVM. Я предполагаю, что это также может быть реализацией, поскольку сбор габаритов закрытого результирующего набора не может быть протестирован.

Ответ 5

Всякий раз, когда вы присваиваете что-то ссылочному типу, вы заменяете старую ссылку на новую.

Например...

MyObject obj = new MyObject("foo");
obj = new MyObject("bar");

Был бы теперь экземпляр MyObject без ссылки с некоторым свойством, установленным на "foo", которое в конечном итоге будет собрано в мусор.

obj хранит ссылку на объект MyObject с некоторым свойством, установленным в "bar".