【问题标题】:Tomcat JNDI connection behavior differs from JDBC connectionTomcat JNDI 连接行为与 JDBC 连接不同
【发布时间】:2013-12-21 06:42:46
【问题描述】:

我有一个使用 jt400 JDBC 驱动程序连接到运行在 iSeries V6R1 上的 DB2 的 Tomcat 7 Web 应用程序。多年来,我一直在使用相同的设置,几乎没有问题。使用我的 context.xml 中设置的 JNDI 连接和我的 WEB-INF/lib 文件夹中的驱动程序,一切都按预期工作,JPA 查询和其他一切。

我现在正在尝试使用调用 RPG 程序的存储过程。当我使用 JNDI 连接时,它出错说它找不到外部程序。如果我使用完全相同的(复制和粘贴的)连接字符串、驱动程序、用户名和密码创建一个新的 JDBC 连接,它就可以完美运行。从 SQuirreL 运行时,相同的存储过程也能完美运行。

使用 JNDI 连接出现以下错误:

[SQL0444] External program xxx in *LIBL not found

这是我的(已清理的)连接字符串:

jdbc:as400:server;naming=system;prompt=false;datetime=iso;libraries=SYSIBM OTHER LIBS AS NEEDED

这是我的代码:

        CallableStatement cs=null;
        // Fails every time
        // Connection conn = getJNDIConnection();
        // Works every time
        Connection conn = getNewJDBCConnection();
        cs = conn.prepareCall("CALL MY_PROC (  0, 'TEST' )");
        cs.execute();

我真的很想依赖 JNDI 连接而不是创建自己的连接,但除非有人知道导致此错误的原因,否则我将不得不使用该解决方法。

谢谢,

约翰

【问题讨论】:

    标签: tomcat stored-procedures jdbc db2 ibm-midrange


    【解决方案1】:

    *LIBL 是一个线索。什么设置了 JNDI 连接的库列表?

    另一个要看的地方是签名。当您通过 JNDI 调用存储过程时,您使用的参数类型和长度是否与使用 SQuirreL 时完全相同?特别要注意 CHAR 参数和 VARCHAR 参数之间的区别。

    【讨论】:

    • 我使用的是完全相同的 SQL,实际上是从 SQuirreL 复制并粘贴的。我这样做是为了消除任何类型不匹配等的可能性。我会将代码添加到我的帖子中,以便更容易看到我在说什么。
    • 对不起,连接字符串本身设置了库列表。注意我正在使用系统命名并指定库列表。我经常使用存储过程,这甚至不是第一个调用 RPG 程序的。
    • 没有库列表'其他需要的库' - JNDI 正在做一些工作,将其转化为实际的库列表。听起来好像没有包含 RPG 程序对象所在的库。尝试制作一个特定的库列表。
    • 出于安全考虑,我只是在该行中添加了该行,实际列表是正确的,并且适用于除此存储过程之外的所有查询,但来自非 JNDI 连接的相同连接字符串仅适用很好。
    • 您可以发布您使用的 CREATE PROCEDURE 语句吗?
    猜你喜欢
    • 2014-09-13
    • 2019-02-23
    • 2017-06-19
    • 2016-03-29
    • 2013-05-01
    • 2012-07-12
    • 2010-12-23
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多