我在网站上进行了搜索,但没有找到能解决我的问题的帖子。
我编写了一个桌面应用程序(Java/swing/JDBC)来通过 JDBC 连接到本地数据库。该数据库托管在 IBM i 系列 (AS400) 上(尽管我非常确定这不是 AS400 独有的问题),并且仅在内部网络上可用。我正在努力将该应用程序转换为 Android 应用程序,以便通过无线连接在仓库中使用。
我的 JDBC 连接位于它自己的线程中。该应用程序在尝试连接之前要求用户输入用户名/密码。连接每次都会失败,并显示相同的消息:java.sql.SQLException:应用程序请求者无法建立连接。 (没有到主机的路由)
这是有问题的代码:
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);
}
它注册驱动程序,然后点击没有到主机的路由
,暂停一秒钟,然后抛出一个错误,完全停止设备,而不是让我的错误处理程序安全地关闭应用程序。
我进行了双重(三重)检查,以确保正确传递凭据,并且正确设置 IP 和架构。该代码是我的桌面代码的直接副本。唯一的区别是我使用针对 Android 而不是桌面优化的 jar。该 jar 仅包含 native AS400 代码和 Java 之间的转换层,但工作方式与任何 SQL jar 相同。
这是我们整个公司使用的主要数据库服务器。它始终可用并且在其上启用了 SQL。我正在使用物理 Android 设备(不是模拟设备)对此进行测试,并且它已连接到我们的内部无线网络。
关于如何解决这个问题或者甚至是寻找方向有什么建议吗?尽管都使用 JDBC,但为什么桌面和我的 Android 之间存在如此大的差异?我需要为地址解析做一些特殊的事情或类似的事情吗? Google-fu 让我很失望。感谢您的帮助!
最佳答案
无线流量因公司安全策略而受到限制的情况并不罕见。
验证您是否可以连接到 DRDA (tcp 端口 446)从无线网络上的设备访问 IBM i。
参见TCP/IP Ports Required for iSeries Access for Windows了解更多信息。
JTOpen/工具箱有一个proxy mode如果安全要求不允许直接访问 IBM i。
JTOpen/Toolbox jar 的轻量级版本也更适合安装在 CPU 和内存受限的环境中,例如 Android 设备。
完整的 JTOpen/Toolbox 可以作为代理服务器运行,如下所示:
java -cp jt400.jar com.ibm.as400.access.ProxyServer -verbose -port 3470
将代理服务器选项添加到您的连接字符串中:
jdbc:as400:<url>;proxy server=<proxy server address:port>
关于java - Android + JDBC : No route to host (it works on the desktop, 为什么不在 Android 上?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409271/