Поведение вызываемых и подготовленных операторов на сервере приложений


CallableStatement и PreparedStatement предварительно скомпилированы. Делаются ли они по отношению к соединению? Я имею в виду, давайте предположим, что в пуле соединений сервера приложений находится около 100 объектов соединения. Есть класс, который использует Callable и PreparedStatements. Допустим, метод, который используется для этого:

public  void invokePreparedAndCallableStatements(){  
  //Fetches connection from pool  
  Connection con = getConnectionFromPool();
  CallableStatement cs = con.prepareCall(.....);
  cs.register...(...);
  cs.execute();
  ...
  ...
  PreparedStatement st = con.prepareStatement(...);
  st.setXXX(..);
  st.executeUpdate();
  ...
 }

Теперь, когда метод вызывается в первый раз, соединение извлекается из пула и обрабатывается запрос. Операторы Callable и Prepared компилируются. Когда метод вызывается еще 99 раз, каждый раз, когда из пула извлекается другое соединение, то - будут ли операторы выполняться для каждого соединения?
Каков будет наиболее оптимальный способ использования операторов в этом контексте? Я не могу сделать их (con.prepareCall() или con.prepareStatement()) статическими, потому что соединение не является статическим.


person markgarg    schedule 23.11.2010    source источник


Ответы (2)


Код фактически компилируется и хранится в общем пуле базы данных. Любое количество соединений, использующих один и тот же код, выиграет от кеша. Скомпилированный код хранится до тех пор, пока позволяют ограничения памяти.

person JOTN    schedule 23.11.2010
comment
Спасибо ДЖОТН. Есть ли способ, которым одна и та же процедура PL/SQL имеет несколько скомпилированных версий для одного и того же кода? - person markgarg; 29.11.2010

Операторы будут предварительно скомпилированы. Объединение будет основано на указанных вами параметрах.

Примечание. Если вы используете JDBC 3.0, вы также можете объединить свои PreparedStatements. Ссылка: Что нового в JDBC 3.0

person crnlx    schedule 23.11.2010