5

我正在尝试做一些看似简单的事情:设置一个小型数据库连接池,以便 servlet(只是一个)不会以每秒 1 个连接的速度创建我的服务器。

Ubuntu 10.04,通过最新的升级/更新,我正在使用Eclipse Jetty 8.1.5.v20120716. 我正在尝试连接到MySQL 5.1服务器。

我的 servlet 被调用gcm,所以在 中${jetty}/contexts,我有这个gcm.xml文件:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
<Configure id="wac" class="org.eclipse.jetty.webapp.WebAppContext">
  <New id="jdbc/myds" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jdbc/myds</Arg>
    <Arg>
      <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
        <Set name="Url">jdbc:mysql://localhost:3306/chat</Set>
        <Set name="User">root</Set>
        <Set name="Password">sillyness</Set>
      </New>
    </Arg>
  </New>
  <Set name="contextPath">/</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/gcm</Set>
  <Set name="extractWAR">true</Set>
</Configure>

当我使用 启动 Jetty 时java -jar start.jar -port=8080,一切都开始正常,直到我尝试从我的 servlet 访问数据库。请求的代码处理部分如下所示:

 public static List<String> getDevices()
    throws javax.naming.NamingException, java.sql.SQLException {
    synchronized (regIds) {
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/myds");
        Connection conn = null;
        Statement stmt = null;

        try {
            conn = ds.getConnection();

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("select * from chatdevice");

        //blah,blah,blah...

我得到的错误是:

    javax.naming.NameNotFoundException; remaining name 'jdbc/myds'
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:500)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:531)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:546)
        at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:112)
        at javax.naming.InitialContext.lookup(InitialContext.java:409) 
        at com.google.android.gcm.demo.server.Datastore.getDevices(Datastore.java:98)

如何让 Jetty 找到数据库代码?

4

2 回答 2

6

就我而言,我去了码头邮件列表(https://dev.eclipse.org/mailman/listinfo/jetty-users)问我的问题。

一个非常聪明的人(Hi Jan!)这样写和回答:

通常有许多不同的方法可以在 jetty 中实现相同的结果,所以这可能就是您看到不同方法记录的原因。通常有选择是一件好事

如果有任何混淆,这是最终页面: http ://wiki.eclipse.org/Jetty/Feature/JNDI如果缺少某些内容,请告诉我们以便我们更新页面。

您的情况有点不寻常,因为您使用的是 javaee 风格的功能,但没有 web.xml。这不是我以前遇到过的,但听起来我应该添加到文档中。

我建议(如上面的页面一样)将任何 jndi 定义放入 WEB-INF/jetty-env.xml 文件而不是上下文 xml 文件中。如果你这样做,那么你可以有效地做一个 web.xml 元素会做的事情,并将你的数据源绑定到 java:comp/env 命名空间,方法是定义你的资源并将它绑定到 java:comp/env 中(注意这个不能在上下文 xml 文件中工作,它必须是 jetty-env.xml)

因此在 WEB-INF/jetty-env.xml 中执行以下操作:

 <New  id="jdbc/myds"  class="org.eclipse.jetty.plus.jndi.Resource">
  <Arg></Arg>
  <Arg>jdbc/myds</Arg>
  <Arg>
    <New  class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
      <Set  name="Url">jdbc:mysql://localhost:3306/chat</Set>
      <Set  name="User">root</Set>
      <Set  name="Password">sillyness</Set>
    </New>
  </Arg>
  <Call name="bindToENC">
     <Arg>jdbc/myds</Arg>
  </Call>   
 </New>

在对 bindToENC 的调用中,将您想要查找的任何名称绑定为 java:comp/env 的后缀。例如,如果您想查找 java:comp/env/my/foo 那么 bindToENC 参数将是“my/foo”。

-- Jan Bartel www.webtide.com – 来自 Jetty & CometD 专家的开发人员建议、服务和支持。_________________________________________________________ 码头用户邮件列表 jetty-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/jetty-users

现在,这还不够(我是码头新手)。所指的WEB-INF就是我的servlet的war文件里面的WEB-INF……所以我把war文件的内容解压到一个目录下,然后就可以轻松的把jetty-env.xml文件放到WEB中了-INF 目录。

这也很关键:

好的,我假设那里有一点码头知识,并且认为您会知道我发布的内容只是您需要拥有完整的 jetty-env.xml 文件的片段。

jetty-env.xml 文件的 wiki 页面在这里: http ://wiki.eclipse.org/Jetty/Reference/jetty-env.xml

因此,将根元素包装在我发布的片段周围,如该页面上所示,你应该很好。

现在 /that/ 得到了要尝试的数据库连接。connection refused from 127.0.0.1然后我在 /var/log/auth.log中遇到错误。

事实证明,我运行了拒绝主机,果然有人把它放在ALL: 127.0.0.1那里……这意味着与我的本地计算机的连接被拒绝。

一旦修复了这个细节,servlet 终于可以访问我服务器上的 MySQL。

于 2012-08-07T11:57:47.257 回答
0

尝试将此添加到 web.xml

<resource-ref>
    <res-ref-name>jdbc/myds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
于 2012-08-06T20:30:10.003 回答