Повторно использовать объект инструкции Java? - PullRequest
23 голосов
/ 23 декабря 2008

Я хотел бы знать, можем ли мы повторно использовать один и тот же объект 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 ()?

Ответы [ 5 ]

21 голосов
/ 07 января 2009

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

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

16 голосов
/ 23 декабря 2008

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

2 голосов
/ 23 декабря 2008

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

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

1 голос
/ 07 января 2011

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

0 голосов
/ 23 декабря 2008

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

Например ...

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...