当前位置: 首页 > 知识库问答 >
问题:

将servlet连接到数据库as400

蒋芷阳
2023-03-14

我正在尝试开发一个android应用程序,它需要通过java servlet连接到远程数据库as400,并将JSON对象返回给用户。

这是我的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启动servlet之后,它会停在“Class.forName(…)它给了我以下的错误:错误!1.爪哇。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)

并且似乎无法连接到服务器,但我确信用户名、密码和dbname是正确的。我必须在IP地址之后插入端口吗?还有其他建议吗?

谢谢你的回答!

共有3个答案

樊琦
2023-03-14

您是否为该程序提供了适当的驱动程序库?首先,您下载数据库连接驱动程序并导入您的程序。并创建与远程数据库的连接并给出类路径和连接路径。然后在您的程序中,类路径和连接路径在您的程序中给出。运行您的程序。它将解决您的问题。

申屠泳
2023-03-14

它停在“Class.forName(…)”处

这是不正确的。该行已执行;如果失败,您将看到ClassNotFoundException

您正在尝试执行下面的连接行。这就是失败的地方。

检查您正在使用的URL。我还要确保您运行的客户机可以看到数据库服务器。你能从客户机ping数据库服务器吗?可以使用某种非JDBC客户端连接到数据库吗?你有权限使用你获得的凭据访问该数据库吗?拥有该数据库的DBA是否知道您的应用程序正在尝试连接到它?

更新:为了确保我理解正确,你说你在运行Java客户端的机器上打开了一个命令shell,并键入了“ping ip地址”,其中“ip地址”与你在连接URL中输入的值相同。

如果我在我的机器上打开一个命令外壳并ping Google,它看起来像这样:

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可能没有使用默认端口。您需要与拥有数据库的人交谈并解决这个问题。

盖翰池
2023-03-14

堆栈跟踪中的ConnectionTimedOut使其看起来像

  • AS/400未配置为回复TCP连接
  • 中间某处有防火墙

在app server机器上,尝试对DB服务器中的AS/400端口进行远程登录,查看它是否能够连接(即使它自动断开连接)或只是挂起。您可以使用Wireshark查看更详细的情况。

 类似资料:
  • 问题内容: 您如何连接到Java中的MySQL数据库? 当我尝试时,我得到 要么 要么 问题答案: 是一种相当古老的做事方式。更好的方法是通过查找已经为您配置的应用服务器容器来获取一个: 或直接从数据库驱动程序实例化和配置一个: 然后从中获取连接,如上:

  • 我正试图将greenplum数据库连接到python上,但我得到了JVMNotFound错误 以下是我所尝试的: 错误消息:引发JVMNotFoundException(“没有JVM共享库文件({0})”JPYPE._JVMFinder.JVMNotFoundException:没有找到JVM共享库文件(JVM.dll)。请尝试正确设置JAVA_HOME环境变量 如有任何帮助,不胜感激

  • 我对java非常陌生。所以如果我犯了愚蠢的错误,我很抱歉。我正在尝试执行servlet中的以下代码,但是在我将值提交到我在索引中创建的登录表单之后,什么也没有发生。html。另外,我还为会话创建了另一个servlet。预期的输出是重定向到我从数据库验证用户名和密码后创建的另一个jsp页面

  • 创建数据库后,必须连接或启动数据库才能正常使用。 语法: 示例: 假设要连接 数据库,参考以下代码: 执行上面命令,得到以下结果:

  • 主要内容:使用SQL * Plus连接到Oracle数据库服务器,使用SQL Developer连接到Oracle数据库服务器在本教程中,您将学习如何使用和SQL Developer 工具连接到Oracle数据库服务器。 使用SQL * Plus连接到Oracle数据库服务器 是安装Oracle数据库服务器或客户端时自动安装的交互式查询工具。 有一个命令行界面,允许您连接到Oracle数据库服务器并交互执行语句。 注意:如果有使用过MySQL或PostgreSQL,与MySQL中的mysql程序

  • 在连接之前,你需要一个受支持的驱动。下面是一些测试过的驱动及其版本,把你所需要的加入到package.json中。 驱动 npm 包 版本 mysql mysql 2.0.0-alpha9 postgres redshift pg 2.6.2 [1] sqlite sqlite3 2.1.7 mongodb mongodb 1.3.19 [1] 如果你要连接到Heroku,请使用版本2.5.0。