Tomcat JNDI 连接行为不同于 JDBC 连接

标签 tomcat stored-procedures jdbc db2 ibm-midrange

我有一个 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/

相关文章:

php - 从 AngularJS UI 获取 MySQL 数据

c# - 在 C# 中从 Entity Framework 调用存储过程

mysql - Google App Scripts 不会在远程服务器上建立到 MySQL 的 Jdbc 连接

python - python中使用cursor.callproc()调用MySQL存储过程

mysql - 尝试在 mysql 中创建 PROCEDURE 时出现错误

postgresql - 调试高 PostgreSQL 内存使用率(每个连接)

Java SQL 访问行数据

java - Tomcat 8.0.18 未收到客户端的完整请求

Eclipse 2019-03 对 Tomcat 9 的支持

java - 如何在 Tomcat 8.5 + Weld 3.0 上配置 Jersey 2.16