2

我已经搜索了该站点,但还没有找到可以回答我的问题的帖子。

我编写了一个桌面应用程序(Java/swing/JDBC)来通过 JDBC 连接到本地数据库。该数据库托管在 IBM i 系列 (AS400) 上(尽管我很确定这不是仅 as400 的问题),并且仅在内部网络上可用。我正在将该应用程序翻译成一个 android 应用程序,以便通过无线连接在仓库中使用。

我在它自己的线程中有我的 JDBC 连接。该应用程序在尝试连接之前询问用户用户名/密码。每次连接都失败并显示相同的消息:java.sql.SQLException: The application requester cannot establish the connection. (No route to host)

这是有问题的代码:

            try 
    {
        // Use the AS400 driver.
        DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
        // Now connect
        connection = DriverManager.getConnection(
                "jdbc:as400://" + IP_ADDRESS + "/" + SCHEMA + 
                ";naming=sql;errors=full",
                USER_ID, PASSWORD);
        System.out.println("Connection established using the AS400 driver(s)");
    }
    catch(Exception as400) 
    {
        String message = "Error setting driver and connection using\n " 
                +  "the AS400 drivers. The error message is as follows:\n " 
                +  as400.getMessage();
        System.out.println(message);
        throw new Exception(message);
    }

它注册驱动程序然后点击No route to host,暂停一秒钟,然后抛出一个错误,完全停止设备,而不是让我的错误处理程序安全地关闭应用程序。

我进行了双重(三重)检查以确保正确传递凭据并且正确设置了 IP 和架构。此代码是我的桌面代码的直接副本。唯一的区别是我使用为 android 而不是桌面优化的 jar。该 jar 仅包含本地 AS400 代码和 Java 之间的转换层,但与任何 SQL jar 的工作方式相同。

这是我们整个公司使用的主要数据库服务器。它始终可用并且在其上启用了 SQL。我正在使用物理 android 设备(不是模拟设备)对此进行测试,它已连接到我们的内部无线网络。

关于如何解决这个问题甚至是寻找方向的任何建议?尽管都使用 JDBC,为什么桌面和我的 android 之间存在如此大的差异?我需要为地址解析或类似的东西做一些特别的事情吗?Google-fu 让我很失望。谢谢你的帮助!

4

1 回答 1

2

由于公司安全策略而限制无线流量的情况并不少见。

验证您是否可以从无线网络上的设备连接到 IBM i 上的DRDA (tcp 端口 446)。

有关更多信息,请参阅iSeries Access for Windows 所需的 TCP/IP 端口


如果安全要求不允许直接访问 IBM i,则 JTOpen/Toolbox 具有代理模式。

图 1:标准客户端和代理客户端如何连接到服务器

JTOpen/Toolbox jar 的轻量级版本也更适合安装在 CPU 和内存受限的环境中,例如 Android 设备。

图 2:代理 JAR 文件和标准 JAR 文件的大小比较

完整的 JTOpen/Toolbox 可以作为代理服务器运行,如下所示:

java -cp jt400.jar com.ibm.as400.access.ProxyServer -verbose -port 3470

代理服务器选项添加到您的连接字符串:

jdbc:as400:<url>;proxy server=<proxy server address:port>
于 2013-08-23T19:55:52.327 回答