Могут ли несколько сервлетов связываться с одним и тем же источником данных (JNDI)? - PullRequest
0 голосов
/ 21 декабря 2011

В моем файле Jetty.xml установлен источник данных, который выглядит следующим образом:

<New id="MySQL_DS" class="org.eclipse.jetty.plus.jndi.Resource">
  <Arg></Arg>
  <Arg>jdbc/MySQL_DS</Arg>
  <Arg>
    <New class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <Set name="driverClass">com.mysql.jdbc.Driver</Set>
      <Set name="jdbcUrl">jdbc:mysql:[IP]</Set>
      <Set name="user">[USER]</Set>
      <Set name="password">[PASSWORD]</Set>
      <Set name="checkoutTimeout">5000</Set>
      <Set name="initialPoolSize">3</Set>
      <Set name="maxIdleTime">3600</Set>
      <Set name="maxPoolSize">50</Set>
      <Set name="minPoolSize">1</Set>
      <Set name="maxStatements">200</Set>
      <Set name="maxConnectionAge">0</Set>
      <Set name="acquireIncrement">3</Set>
    </New>
  </Arg>
</New>

Он определен в моем файле web.xml следующим образом:

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/MySQL_DS</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

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

InitialContext ctx = new InitialContext();
_dataSource = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQL_DS");

Мой вопрос:

Мне нужно иметь 4 сервлета, использующих этот контекстный поиск, на том же источнике данных.Возможна ли такая вещь?

Я имею в виду, может ли несколько сервлетов связываться с одним и тем же источником данных, или каждый сервлет должен иметь свой собственный?

Я спрашиваю об этом, потому что у меня есть один сервлетэто работает правильно, но другой выдает javax.naming.NameNotFoundException (оставшееся имя jdbc / MySQL_DS).

Спасибо!

1 Ответ

2 голосов
/ 21 декабря 2011

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

Я работаю над веб-приложением Java EE, в котором есть несколько сервлетов, в которых все используют одни данные.Источник для подключения к БД.Это веб-приложение использует Oracle в качестве внутреннего сервера, а WebLogic Server - в качестве сервера приложений.

В архитектуре этого веб-приложения есть специальный класс для подключения к БД.Все сервлеты вызывают этот класс для получения соединения с БД.

Этот класс соединений имеет следующие строки в конструкторе (аналогично вашему выше) ...

InitialContext ic=new InitialContext();
DataSource ds=(DataSource) ic.lookup("jdbc/OracleDS");
con=ds.getConnection("user","pwd"); \\ ("con" is a private Connection instance var)

Затем каждый из сервлетов просто использует класс соединения для подключения к БД.

Например ...

MyConnectionClass con = new MyConnectionClass(); // ("MyConnectionClass" is where the data source info is...)
PreparedStatement ps=con.prepareStatement("SELECT * FROM SOME_TABLE");
ResultSet rs=ps.executeQuery();
more code below...

...