5

私は一見単純なことをしようとしています: データベース接続の小さなプールをセットアップして、サーブレット (1 つだけ) が 1 秒あたり 1 接続でサーバーを作成しないようにします。

ではUbuntu 10.04、最新のアップグレード/アップデートで、 を使用してEclipse Jetty 8.1.5.v20120716います。サーバーに接続しようとしていMySQL 5.1ます。

私のサーブレットは という名前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、サーブレットからデータベースにアクセスしようとするまで、すべてが正常に開始されます。リクエストのコード処理部分は次のようになります。

 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

私の場合、jettyメーリングリスト(https://dev.eclipse.org/mailman/listinfo/jetty-users)にアクセスして質問しました。

非常に賢い人(こんにちはJan!)は次のように書いたり答えたりしました:

突堤で同じ結果を達成するための一般的に多くの異なる方法があります、それでおそらくあなたが文書化された異なる方法を見た理由です。一般的にオプションを持つことは良いことです

混乱が生じた場合に備えて、これが最も信頼のおけるページです 。http ://wiki.eclipse.org/Jetty/Feature/JNDI不足しているものがある場合は、ページを更新できるようにお知らせください。

あなたのケースは、javaeeスタイルの機能を使用しているが、web.xmlがないという点で、少し変わっています。これは私が以前に遭遇したことではありませんが、ドキュメントに追加する必要があるもののように聞こえます。

(上記のページと同様に)jndi定義をコンテキストxmlファイルではなくWEB-INF/jetty-env.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メーリングリストjetty-users@eclipse.orghttps ://dev.eclipse.org/mailman/listinfo/jetty-users

さて、それは十分ではありませんでした(私は突堤の初心者です)。参照されたWEB-INFは、サーブレットのwarファイル内のWEB-INFでした...したがって、warファイルの内容をディレクトリに抽出すると、jetty-env.xmlファイルをWEBに簡単に配置できました。 -INFディレクトリ。

これも重要でした:

OK、私はそこで少し桟橋の知識があると仮定し、私が投稿したものは完全な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でエラーが発生していました。

結局、私はdenyhostsを実行していました、そして確かに誰かがALL: 127.0.0.1そこに入れました...それは私のローカルマシンへの接続が拒否されたことを意味しました。

その詳細が修正されると、サーブレットは最終的にサーバー上の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 に答える