连接到 Play Framework 上的 as400 JDBC

问题描述 投票:0回答:3

我在 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,我可以在“外部库”下看到它显示并且可用。但本质上我收到一条关于无法连接(在我知道有效的用户/密码上)和

execute 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)

我可以使用以下方式连接其他基于 java 的项目:

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);
            }
java jdbc playframework ibm-midrange
3个回答
3
投票

从堆栈跟踪猜测,从驱动程序返回的连接似乎与连接Hikari 连接池 配合得不好。 Hikari 是 playframework 中的默认连接池

具体来说,您的异常跟踪显示 Hikari CP 正在尝试调用 JDBC 驱动程序返回的连接对象上的

isValid
方法,然后失败并显示
java.lang.AbstractMethodError

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


0
投票

尝试将以下内容添加到 application.config

db.default.hikaricp.connectionTestQuery =“选择1”

未在 Play Framework 中进行测试,但我在 spring 框架上遇到类似问题并以这种方式解决。


0
投票

使用如下所示的 Liquibase 数据源和连接测试查询

@Bean
@LiquibaseDataSource
public DataSource liquibaseDataSource() {
     HikariDataSource dataSource = (HikariDataSource) DataSourceBuilder.create().url("url")
                    .username("username")
                    .password("password")
                    .type(HikariDataSource.class).build();
    dataSource.setConnectionTestQuery("select 1 from sysibm.sysdummy1");
    return dataSource;
}
© www.soinside.com 2019 - 2024. All rights reserved.