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

时间:2013-12-04 16:47:17

标签: 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连接而不是创建自己的连接,但我必须使用该解决方法,除非有人知道导致此错误的原因。

谢谢,

约翰

1 个答案:

答案 0 :(得分:0)

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

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