我有一个Spring Boot应用程序连接到多个数据库- Oracle, SQLServer, DB2, MySQL等
我通过Gradle dependencies导入必要的JDBC驱动程序:
implementation 'mysql:mysql-connector-java:8.0.22'
implementation ('com.microsoft.sqlserver:mssql-jdbc:8.4.1.jre8')
implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '19.9.0.0'
implementation group: 'com.ibm.db2', name: 'jcc', version: '11.5.6.0'
等等。它们都很好。
我现在需要连接到AS400服务器上的DB2。有两种可能的驱动程序:一种是通过带有许可证的DBConnect,或者是开放源码的JT400库。我正在使用后者。
我在同一构建中添加了这个依赖语句。gradle文件:
implementation group: 'net.sf.jt400', name: 'jt400', version: '10.6'
刷新依赖项按预期下载库。当启动应用程序时,我甚至可以在类路径声明中看到它:
[...]681a/jjwt-0.9.1.jar:/home/paul/.gradle/caches/modules-2/files-2.1/net.sf.jt400/jt400/10.6/3f391a43632a93874dd3f544d7cb5a91b7a02380/jt400-10.6.jar:/home/paul/.gradle/caches/modules-2/files-2.1/...
如果我尝试连接到AS400 URL,然而,我得到一个"没有找到合适的驱动程序";当尝试连接时。
当尝试连接时,我可以调试到应用程序中,并尝试Class.forName("com.ibm.as400.access.AS400JDBCDriver")
并收到一个未发现异常的类。如果我打开引用的jar文件,则命名的类如预期的那样存在。
我在命令行上用这个特殊的jar构建了一个小的示例应用程序,它执行得很好(响应是预期的,因为我还没有指向一个实际的AS400服务器)。
paul@paul-adm-dev:~/$ java -cp .:/home/paul/.gradle/caches/modules-2/files-2.1/net.sf.jt400/jt400/10.6/3f391a43632a93874dd3f544d7cb5a91b7a02380/jt400-10.6.jar AS400ConnectionExample
java.sql.SQLException: The application requester cannot establish the connection. (Connection refused (Connection refused))
我尝试将依赖项更改为Compile和过时的Runtime,但无济于事。我甚至在组成整个应用程序的其他子项目中尝试过导入,但总是得到相同的结果。
我被难住了。什么可能导致这个库没有被加载?解决。叹息。
这个特殊的驱动程序,尽管它自己的文档,不自动注册到SQL驱动程序管理器。
在创建连接的组件的静态初始化器中添加Class.forName("com.ibm.as400.access.AS400JDBCDriver")
解决了这个问题。不知道为什么它在调试会话评估窗口中失败了,但至少现在我知道为什么这个驱动程序不像其他驱动程序那样"只是工作"。