我有一个 Tomcat 7 Web 应用程序,它使用 jt400 JDBC 驱动程序连接到在 iSeries V6R1 上运行的 DB2。多年来我一直在使用相同的设置,几乎没有问题。使用在我的 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 连接而不是创建自己的连接,但我将不得不使用该解决方法,除非有人知道导致此错误的原因。
谢谢,
约翰
最佳答案
*LIBL 是这里的线索。什么设置了 JNDI 连接的库列表?
另一个要看的地方是签名。当您通过 JNDI 调用存储过程时,您是否使用与使用 SQuirreL 时完全相同的参数类型和长度?尤其要注意 CHAR 参数和 VARCHAR 参数之间的区别。
关于Tomcat JNDI 连接行为不同于 JDBC 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20381129/