1

Javaサーブレットを介してリモートデータベースas400に接続し、JSONオブジェクトをユーザーに返す必要があるAndroidアプリケーションを開発しようとしています。

これは私のDoGetメソッドコードです:

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws       ServletException, IOException {
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    out.println("{");

    Connection conn = null;
    try {
    Class.forName("com.ibm.as400.access.AS400JDBCDriver").newInstance();
        conn = DriverManager.getConnection( "jdbc:as400://ipaddress;database name=dbname", "username", "password");
        System.out.println("Connected to the database");
    } catch (Exception e) {
        System.out.println("error! 1");
        e.printStackTrace();
    }


    try {
        conn.close();
        System.out.println("Disconnected from database");
    } catch (Exception e) {
        System.out.println("error! 2");
        e.printStackTrace();
    }

}

Eclipse でサーブレットを起動すると、「Class.forName(....)」で停止し、次のエラーが表示されます。1 java.sql.SQLException: アプリケーションリクエスタが接続を確立できません (接続タイムアウト: 接続)

at com.ibm.as400.access.JDError.throwSQLException(JDError.java:565)
at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3332)
at com.ibm.as400.access.AS400JDBCDriver.prepareConnection(AS400JDBCDriver.java:1393)
at com.ibm.as400.access.AS400JDBCDriver.initializeConnection(AS400JDBCDriver.java:1230)
at com.ibm.as400.access.AS400JDBCDriver.connect(AS400JDBCDriver.java:371)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at it.liuc.webtest.Servlet1.doGet(Servlet1.java:31)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.ibm.as400.access.PortMapper.getSocketConnection(PortMapper.java:273)
at com.ibm.as400.access.PortMapper.getServerSocket(PortMapper.java:161)
at com.ibm.as400.access.AS400ImplRemote.signonConnect(AS400ImplRemote.java:2334)
at com.ibm.as400.access.AS400ImplRemote.signon(AS400ImplRemote.java:2250)
at com.ibm.as400.access.AS400.sendSignonRequest(AS400.java:3042)
at com.ibm.as400.access.AS400.promptSignon(AS400.java:2606)
at com.ibm.as400.access.AS400.signon(AS400.java:3921)
at com.ibm.as400.access.AS400.connectService(AS400.java:1175)
at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3324)
... 20 more
java.lang.NullPointerException
at it.liuc.webtest.Servlet1.doGet(Servlet1.java:43)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

サーバーに接続できないようですが、ユーザー名、パスワード、およびデータベース名が正しいと確信しています。IP アドレスの後にポートを挿入する必要がありますか? 他の提案はありますか?

回答ありがとうございます!

4

3 に答える 3

3

スタック トレースでは、次のConnectionTimedOutいずれかのように見えます。

  • AS/400 が TCP 接続に応答するように構成されていない
  • 中間のどこかにファイアウォールがあります

アプリ サーバー マシンから、DB サーバーの AS/400 ポートに telnet を実行してみて、接続できるかどうか (自動的に切断される場合でも)、またはハングしたままになるかどうかを確認します。Wireshark を使用して、何が起こっているかをより詳細に確認できます。

于 2012-05-10T10:18:18.757 に答える
2

「Class.forName(....)」で止まります

これは正しくありません。その行は実行されました。失敗した場合は、ClassNotFoundException.

接続が行われる次の行を実行しようとしています。それが失敗です。

使用している URL を確認します。また、実行しているクライアント マシンがデータベース サーバーを認識できることも確認します。クライアント マシンからデータベース サーバーに ping を実行できますか? ある種の非 JDBC クライアントを使用してデータベースに接続できますか? 与えられた資格情報でそのデータベースにアクセスする権限がありますか? そのデータベースを所有する DBA は、アプリケーションがデータベースに接続しようとしていることを知っていますか?

更新: 私が正しく理解していることを確認するために、Java クライアントを実行しているマシンでコマンド シェルを開き、「ping ip-address」と入力したと言っています。「ip-address」は接続 URL に入力した値と同じです。

自分のマシンでコマンド シェルを開いて Google に ping を実行すると、次のようになります。

C:>ping www.google.com

Pinging www.l.google.com [74.125.130.147] with 32 bytes of data:

Reply from 74.125.130.147: bytes=32 time=29ms TTL=42
Reply from 74.125.130.147: bytes=32 time=27ms TTL=42
Reply from 74.125.130.147: bytes=32 time=29ms TTL=42
Reply from 74.125.130.147: bytes=32 time=28ms TTL=42

Ping statistics for 74.125.130.147:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 27ms, Maximum = 29ms, Average = 28ms

C:>

そうでない場合は、答えがあります。クライアント マシンは、ネットワーク上のデータベース サーバーを認識できません。

データベースをセットアップした DBA がデフォルトのポートを使用していない可能性があるため、ポートは重要です。データベースの所有者と話し、これを整理する必要があります。

于 2012-05-10T10:10:33.767 に答える
1

このプログラムに適切なドライバ ライブラリを与えましたか? まず、データベース接続ドライバーをダウンロードして、プログラムにインポートします。そして、リモート データベースへの接続を作成し、クラス パスと接続パスを指定します。そして、プログラムで、そのクラスパスと接続パスがプログラムで提供されます。プログラムを実行します。それはあなたの問題を解決します。

于 2012-06-18T05:19:21.887 に答える