2016-11-07 108 views
1

我在連接到Play!中的AS400數據庫時出現問題。連接到播放框架上的as400 JDBC文件

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在classpath中,我可以「的外部庫」下看到它顯示出來,並提供。但基本上,我收到了關於無法連接(關於用戶/密碼,我知道有效)以及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); 
      } 
+1

聽起來像這樣的JDBC驅動程序是JDBC 3或更舊版本,在Java 6/JDBC 4中添加了'Connection.isValid(int)'方法。 –

+0

有沒有辦法找到哪個版本的Java/JDBC jt400使用?很難找到答案。 –

+0

詢問IBM,閱讀隨附的文檔?我不使用AS/400,所以我不知道。 –

回答

3

從堆棧跟蹤猜測,似乎從你的驅動程序返回的連接不與玩好連接Hikari Connection Pool。 Hikari是default connection pool in playframework

具體而言,您的異常跟蹤顯示Hikari CP正在嘗試針對JDBC驅動程序返回的連接對象調用isValid方法,然後以java.lang.AbstractMethodError執行失敗。

您可以嘗試切換到BoneCP連接池並查看是否有幫助。您也可以在hikari github問題列表上檢查關於this issue的意見

+0

完美!多個連接池的選項(並且很容易在'application.conf'中設置)正是我所需要的。只需添加一個'play.db.pool = bonecp'即可。 –

+0

很高興知道它有幫助 –