多个servlet可以绑定到同一个数据源(JNDI)吗?

时间:2011-12-21 18:34:13

标签: java jetty jndi c3p0

我在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>

我在我的servlet代码中绑定到我的数据源:

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

我的问题是:

我需要在同一数据源上使用此上下文查找来使用4个servlet。这样的事情甚至可能吗?

我的意思是,多个servlet可以绑定到同一个数据源,还是每个servlet都有自己的一个?

我问这个是因为我有一个正常工作的servlet但另一个抛出了一个javax.naming.NameNotFoundException(剩下的名字是jdbc / MySQL_DS)。

谢谢!

1 个答案:

答案 0 :(得分:2)

据我所知,您不必为每个servlet指定唯一的数据源。

我正在开发一个Java EE Web应用程序,其中包含多个servlet,它们都使用一个数据源连接到数据库。此Web应用程序使用Oracle作为后端,使用WebLogic Server作为应用程序服务器。

在此Web应用程序的体系结构中,有一个用于连接到数据库的专用类。所有servlet都会调用此类来获取与DB的连接。

此连接类在构造函数中具有以下行(与您的类似)...

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

然后,每个servlet只使用连接类连接到DB。

例如......

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...