db2 AS400 Sping Boot Java连接

zphenhs4  于 2023-04-30  发布在  DB2
关注(0)|答案(3)|浏览(301)

我有以下exeption试图连接到数据库
HikariPool-1 - Driver does not support get/set network timeout for connections. (Receiver class com.ibm.as400.access.AS400JDBCConnectionImpl does not define or inherit an implementation of the resolved method abstract setNetworkTimeout(Ljava/util/concurrent/Executor;I)V of interface java.sql.Connection.)
这是我的pom

<dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-data-jpa</artifactId>
       </dependency>
       <dependency>
           <groupId>net.sf.jt400</groupId>
           <artifactId>jt400</artifactId>
           <version>10.5</version>
       </dependency>
   </dependencies>

和应用yaml

spring.datasource:
  url: jdbc:as400://xxx/xxx
  username: xxx
  password: xxx
  driver-class-name: com.ibm.as400.access.AS400JDBCDriver
  hikari.connection-test-query: values 1
spring.jpa:
  database-platform: org.hibernate.dialect.DB2400Dialect
  hibernate.ddl-auto: none
iswrvxsc

iswrvxsc1#

您使用的是错误的jt 400版本。jar。默认版本使用JDK 4编译。setNetworkTimeout方法需要Executor类,该类直到JDK 1才添加。6.你需要使用java 6/jt 400的版本。jar或java8/jt 400。下载包中的jar文件。
在Maven中,您需要指定jt400_jdk6分类器。

<dependency>
    <groupId>net.sf.jt400</groupId>
    <artifactId>jt400</artifactId>
    <classifier>jt400_jdk6</classifier>
    <version>10.5</version>
</dependency>
bprjcwpo

bprjcwpo2#

我已经研究了AS400JDBCConnectionImplAS400JDBCConnection没有setNetworkTimeout(Executor executor, int milliseconds)方法。也许你可以从它创建一个类并定义缺少的函数。我不能测试它,我希望它可以运行。
注意:package的位置很重要,你应该放在com.ibm.as400.access中访问基类的构造函数。软件包可以位于您的工作区,如下图。

package com.ibm.as400.access;

import java.sql.SQLException;
import java.util.concurrent.Executor;

public class CustomAs400JDBCConnection extends AS400JDBCConnectionImpl {
    @Override
    public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException {
        synchronized (this) {
            this.setNetworkTimeout(milliseconds);
        }
    }

    @Override
    public void setClientInfo(Properties properties) {
        try {
            super.setClientInfo(properties);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    @Override
    public void setClientInfo(String s, String s1) {
        try {
            super.setClientInfo(s, s1);
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
}

application.yaml

spring.datasource:
  url: jdbc:as400://xxx/xxx
  username: xxx
  password: xxx
  driver-class-name: com.ibm.as400.access.CustomAs400JDBCConnection
  hikari.connection-test-query: values 1
spring.jpa:
  database-platform: org.hibernate.dialect.DB2400Dialect
  hibernate.ddl-auto: none
w8f9ii69

w8f9ii693#

您需要使用jdk 6 -9版本(当前版本为'net.sf.jt400:jt400-jdk9:11.1'
另外,你应该像这样使用'thread used=false'选项:

jdbc:as400://${HOST};errors=full;thread used=false;keep alive=true;

更多详细信息,请参阅驱动程序文档https://jt400.sourceforge.net/doc/com/ibm/as400/access/doc-files/JDBCProperties.html
注意3:只有当“threadused”属性设置为false时,才应该使用套接字超时。默认情况下,JDBC驱动程序将创建一个线程,该线程总是在等待服务器响应的套接字读取时被阻塞,并且连接空闲时间超过套接字超时将丢弃该连接。

相关问题