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

Tomcat JNDI连接行为不同于JDBC连接,tomcat,stored-procedures,jdbc,db2,ibm-midrange,Tomcat,Stored Procedures,Jdbc,Db2,Ibm Midrange,我有一个Tomcat7Web应用程序,它使用JT400JDBC驱动程序连接到运行在iSeries V6R1上的DB2。多年来,我一直在使用相同的设置,没有什么问题。使用在my context.xml中设置的JNDI连接和WEB-INF/lib文件夹中的驱动程序,一切都按预期工作,JPA查询和其他一切都正常 我现在尝试使用一个调用RPG程序的存储过程。当我使用JNDI连接时,它会错误地说它找不到外部程序。如果我使用完全相同的复制和粘贴的连接字符串、驱动程序、用户名和密码创建一个新的JDBC连接,那

我有一个Tomcat7Web应用程序,它使用JT400JDBC驱动程序连接到运行在iSeries V6R1上的DB2。多年来,我一直在使用相同的设置,没有什么问题。使用在my 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参数之间的区别

我使用的是完全相同的SQL,事实上,我从SQuirreL复制并粘贴了它。我这样做是为了消除任何类型不匹配的可能性,等等。我将把代码添加到我的帖子中,以便更容易地看到我在说什么。对不起,连接字符串本身设置了库列表。注意,我正在使用系统命名和指定库列表。我经常使用存储过程,这甚至不是第一个调用RPG程序的存储过程。没有库列表“其他需要的库”-JNDI正在做一些工作,以将其转化为实际的库列表。听起来好像它没有包含RPG程序对象所在的库。试着创建一个特定的库列表。出于安全考虑,我刚刚加入了这一行,实际的列表是正确的,除了这个存储过程之外,我的所有查询都可以正常工作,但是来自非JNDI连接的相同连接字符串也可以正常工作。您可以发布您使用的CREATE procedure语句吗?