Java 在Play框架上连接到as400 JDBC

Java 在Play框架上连接到as400 JDBC,java,jdbc,playframework,ibm-midrange,Java,Jdbc,Playframework,Ibm Midrange,我在连接Play!中的AS400数据库时遇到问题 我的application.conf看起来像: db.default.driver="com.ibm.as400.access.AS400JDBCDriver" db.default.url="jdbc:as400://SERVER;libraries=A,B,C;toolbox trace=all;trace=true" db.default.username="user" db.default.password="password" 我已经

我在连接Play!中的AS400数据库时遇到问题

我的
application.conf
看起来像:

db.default.driver="com.ibm.as400.access.AS400JDBCDriver"
db.default.url="jdbc:as400://SERVER;libraries=A,B,C;toolbox trace=all;trace=true"
db.default.username="user"
db.default.password="password"
我已经在类路径中设置了jt400,我可以在“外部库”下看到它显示并可用。但从本质上讲,我得到了一条错误消息,关于无法连接(在我知道有效的用户/密码上)和无法执行isValid(),这是一个在
AS400JDBCConnection
类中找不到的函数

[error] c.z.h.p.PoolBase - HikariPool-1 - Failed to execute isValid() for connection, configure connection test query. (com.ibm.as400.access.AS400JDBCConnection.isValid(I)Z)
[error] application - 

! @72265nf0a - Internal server error, for (GET) [/] ->

play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]]
    at play.api.Configuration$.configError(Configuration.scala:154)
    at play.api.Configuration.reportError(Configuration.scala:806)
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:48)
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42)
    at scala.collection.immutable.List.foreach(List.scala:381)
    at play.api.db.DefaultDBApi.connect(DefaultDBApi.scala:42)
    at play.api.db.DBApiProvider.get$lzycompute(DBModule.scala:72)
    at play.api.db.DBApiProvider.get(DBModule.scala:62)
    at play.api.db.DBApiProvider.get(DBModule.scala:58)
    at com.google.inject.internal.ProviderInternalFactory.provision(ProviderInternalFactory.java:81)
Caused by: play.api.Configuration$$anon$1: Configuration error[Failed to initialize pool: com.ibm.as400.access.AS400JDBCConnection.isValid(I)Z]
    at play.api.Configuration$.configError(Configuration.scala:154)
    at play.api.PlayConfig.reportError(Configuration.scala:996)
    at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:70)
    at play.api.db.PooledDatabase.createDataSource(Databases.scala:199)
    at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123)
    at play.api.db.DefaultDatabase.dataSource(Databases.scala:121)
    at play.api.db.DefaultDatabase.getConnection(Databases.scala:142)
    at play.api.db.DefaultDatabase.getConnection(Databases.scala:138)
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:44)
    at play.api.db.DefaultDBApi$$anonfun$connect$1.apply(DefaultDBApi.scala:42)
Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: com.ibm.as400.access.AS400JDBCConnection.isValid(I)Z
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:512)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:105)
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:71)
    at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:58)
    at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:54)
    at scala.util.Try$.apply(Try.scala:192)
    at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:54)
    at play.api.db.PooledDatabase.createDataSource(Databases.scala:199)
    at play.api.db.DefaultDatabase.dataSource$lzycompute(Databases.scala:123)
    at play.api.db.DefaultDatabase.dataSource(Databases.scala:121)
Caused by: java.lang.AbstractMethodError: com.ibm.as400.access.AS400JDBCConnection.isValid(I)Z
    at com.zaxxer.hikari.pool.PoolBase.checkDriverSupport(PoolBase.java:400)
    at com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:375)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:346)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:506)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:105)
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:71)
    at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:58)
    at play.api.db.HikariCPConnectionPool$$anonfun$1.apply(HikariCPModule.scala:54)
    at scala.util.Try$.apply(Try.scala:192)
    at play.api.db.HikariCPConnectionPool.create(HikariCPModule.scala:54)

从stacktrace猜测,从驱动程序返回的连接似乎与连接不匹配。希卡里是

具体地说,异常跟踪显示Hikari CP正试图调用JDBC驱动程序返回的连接对象上的
isValid
方法,然后由于
java.lang.AbstractMethodError
而失败


您可以尝试切换到BoneCP连接池,看看是否有帮助。您还可以查看hikari github问题列表上的评论

听起来JDBC驱动程序是JDBC 3或更早版本,Java 6/JDBC 4中添加了
Connection.isValid(int)
方法。有没有办法找到Java/JDBC jt400使用的版本?很难找到答案。询问IBM,阅读附带的文档?我不使用AS/400,所以我不知道。用户JDBC4的最新版本。我已经在我的环境中设置了Java8。拥有Java8并不意味着什么。JDBC3驱动程序(如果可以找到的话,甚至可以是1或2)可以在Java8下工作,只要您不调用在以后的JDBC版本中定义的任何方法(这在一般情况下适用于Java,顺便说一句,您可以使用根据早期版本的接口编译的类,以及该接口的较新版本,只要您不调用该较新版本的接口中定义的方法)。完美!多个连接池的选项(并且可以轻松地在
application.conf
内部设置)这正是我所需要的。只需添加一个
play.db.pool=bonecp
就可以了。@Shawn请验证您的解决方案
try {
                Class.forName("com.ibm.as400.access.AS400JDBCDriver");
                Connection con = DriverManager.getConnection("jdbc:as400://" + 
                    ApplicationAuthentication.server + "/" + 
                    ApplicationAuthentication.library, 
                    ApplicationAuthentication.user, 
                    ApplicationAuthentication.password
                );
            } catch (Exception e) {
                System.err.println(e);
                throw new WebApplicationException(genericError, Response.Status.UNAUTHORIZED);
            }