首页 > 编程语言 >为 Spring Boot 2.6.2 JdbcTemplate 添加新数据源

为 Spring Boot 2.6.2 JdbcTemplate 添加新数据源

时间:2024-05-29 23:34:52浏览次数:12  
标签:java postgresql spring-boot jdbc

我有一个现有的 Spring Boot 2.6.2 微服务,我们希望将调用添加到一个新的数据源。该服务将部署到使用 Java 8 的 Openliberty 23.0.0.10。我创建了一个新的 DAO:

public class iSeriesDatabaseDao {

       @Autowired
       private JdbcTemplate jdbcTemplate;

       public String getPhoneNumber(String number)
                                    抛出 SSOServiceException {

                try {
                       String sqlString = String.join(" "、
                            "SELECT phone AS SPECIALITY, (wrkph1 CONCAT wrkph2 CONCAT wrkph3) AS PHONE FROM PRVMAS where PROVNO = '%s'");
                       String getPhone = String.format(sqlString,number);
                       return String.valueOf(jdbcTemplate.queryForList(getPhone));

                   } catch (Exception e) {
                         throw new SSOServiceException("Error in the query the
                   配置表时出错:" + e.getMessage());

                  }
              }

我已经更新了服务器.xml。

我已更新了 server.xml,以说明新的 JDBC 驱动程序和数据源连接。

 <jdbcDriver id="DB2iSeries">;
                             <library name="DB2iToolboxLib">;
                                           <fileset dir="${wlp.user.dir}/shared/resources" includes="jt400.jar" />;
                             </library>;
              </jdbcDriver>;
<代码
<dataSource jdbcDriverRef="DB2iSeries" jndiName="jdbc/iSeriesDataSource">;
    <properties serverName="${env.DB_ISERIES_URL}" password="${env.DB_ISERIES_PWD}" user="${env.DB_USERID}" />;
</dataSource>;

我还更新了我的 application.properties 文件。

spring.datasource.jndi-name=jdbc/PostgresSQLDataSource
spring.datasource.jndi-name-iSeries=jdbc/iSeriesDataSource

当我测试我的代码时,我得到了以下错误信息。

[ERROR ] 连接错误:
SSL error: sun.security.validator.ValidatorException:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[ERROR ] Failed to create a ConnectionPoolDataSource from PostgreSQL JDBC Driver 42.1.4 for user_xxx at jdbc:postgresql://Dev.xxx.com:3306/xxx?prepareThreshold=5&preparedStatementCacheQueries=256&preparedStatementCacheSizeMiB=5&databaseMetadataCacheFields=65536&databaseMetadataCacheFieldsMiB=5&defaultRowFetchSize=0&binaryTransfer=true&;readOnly=false&binaryTransferEnable=&binaryTransferDisable=&unknownLength=2147483647&logUnclosedConnections=false&disableColumnSanitiser=false&ssl=true&tcpKeepAlive=false&;loginTimeout=0&connectTimeout=10&socketTimeout=0&cancelSignalTimeout=10&receiveBufferSize=-1&sendBufferSize=-1&ApplicationName=PostgreSQL JDBC Driver&useSpnego=false&gsslib=auto&;sspiServiceClass=POSTGRES&allowEncodingChanges=false&targetServerType=any&loadBalanceHosts=false&hostRecheckSeconds=10&preferQueryMode=extended&autosave=never&reWriteBatchedInserts=false:org.postgresql.util.PSQLException:SSL error: sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到指向请求目标的有效认证路径。
              at org.postgresql.ssl.MakeSSL.convert(MakeSSL.java:67)
              at org.postgresql.core.v3.ConnectionFactoryImpl.enableSSL(ConnectionFactoryImpl.java:359)
              at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:148)
              at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
              at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:194)
              at org.postgresql.Driver.makeConnection(Driver.java:450)

此处引用的 PostgreSQL 数据库是一个现有连接,而不是我的新连接。PostgreSQL 连接运行正常。设置新的 iSeries 连接还需要进行哪些更改?


你的问题似乎是你的Spring Boot应用无法建立与PostgreSQL数据库的SSL连接,而不是iSeries的配置问题。错误信息清楚地表明了“PKIX路径构建失败”,这意味着你的应用无法验证PostgreSQL服务器提供的SSL证书。

以下是解决此错误的步骤:

  1. 获取PostgreSQL服务器的SSL证书: 你需要从PostgreSQL服务器获取SSL证书。这可以通过多种方式实现,具体取决于你的服务器配置。一种常见的方法是使用以下OpenSSL命令: bash openssl s_client -showcerts -connect your_postgres_server:5432 < /dev/null | openssl x509 -outform PEM > postgresql_server.crtyour_postgres_server 替换为你的PostgreSQL服务器地址和端口。

  2. 导入证书到你的Java密钥库: 你需要将获取的SSL证书导入到你的Java运行时环境使用的信任库中。你可以使用 keytool 命令行工具来完成此操作: bash keytool -import -trustcacerts -alias postgresql_server -file postgresql_server.crt -keystore $JAVA_HOME/jre/lib/security/cacerts 你可能需要提供密钥库的密码(默认密码为 changeit)。

  3. 验证你的 application.properties 文件: 确保你的 application.properties 文件中没有与PostgreSQL数据库相关的其他SSL配置冲突。

完成这些步骤后,重新启动你的Spring Boot应用,它应该能够成功建立与PostgreSQL数据库的SSL连接。

关于iSeries连接的注意事项:

  • 确保你的 jt400.jar 文件位于 wlp.user.dir/shared/resources 目录中,并且你的 server.xml 文件中配置的路径正确。
  • 你可能需要添加一个 @Repository 注解到你的 iSeriesDatabaseDao 类,以便Spring Boot可以自动扫描并配置它。
  • 你可以使用 @Qualifier 注解来区分 iSeriesDataSourcePostgresSQLDataSource,例如: java @Autowired @Qualifier("iSeriesDataSource") private JdbcTemplate jdbcTemplate;
  • 确保你的iSeries数据库连接信息(例如URL、用户名和密码)在你的 application.properties 文件中正确配置。

如果在完成上述步骤后仍然遇到问题,请提供以下信息:

  • 你使用的iSeries驱动程序的版本
  • 你的 application.properties 文件的完整内容(删除敏感信息)
  • 你在尝试连接到iSeries数据库时遇到的任何其他错误消息

标签:java,postgresql,spring-boot,jdbc
From: 78550594

相关文章

  • Frida - Java 应用程序在替换方法后冻结
    我能否(从java反编译器中)知道类和方法的名称以替换其实现或让JVM调用我的方法而不是目标方法?(在运行时)为此,我尝试使用frida,但替换后应用程序会冻结。Env$java--versionjava17.0.112024-04-16LTSJava(TM)SE运行时环境(构建17.0.11+7-LTS-207)JavaHotSpot(TM)64位......
  • Java 中主要使用 Json 注释
    我从DB收到了JSON格式的数据,但我必须将所有字段对齐到适当的位置,如下所示:{"姓名":"Maveric"、"年龄":"26"、地址"波士顿街22号";}......
  • Java 异常概述
    Java异常概述程序中的异常异常:指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。异常指的并不是语法错误和逻辑错误。语法错误,则不会产生字节码文件,不能正常运行代码逻辑错误,则仅仅是不能得到想要的结果Java异常抛出机制​Java中把......
  • 一文了解java枚举
    1.枚举的由来当我们知道所有变量的可能性时,尽量使用枚举类型来定义,比如季节,春夏秋冬,一周(一二三四五六七),只读不需要修改有限的一个一个列举出来的类叫做枚举类,枚举是一组常量的集合,枚举也是一个特殊的类,里面包含了一组有限的特定对象2.自定义实现枚举不需要提供......
  • 前端学习笔记——JavaScript基础语言的学习(三)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1,类型转换:把一种数据类型的变量转换成......
  • 前端学习笔记——JavaScript基础语言的学习(二)
    作者简介:大家好,本人刚专升本上岸,是个前端小菜鸟。每日都会虚心的学习。有什么写的不好的,大家都可以帮我提出来。我跟着pink老师学的!!!强烈推荐:https://www.bilibili.com/video/BV14J4114768p=1&vd_source=38cea56ff3dcca4556d2d0f0f2c18c0c1.数组的基本使用2.常量的基本使用......
  • Java浅拷贝大揭秘:如何轻松复制两个不同对象的某些相同属性
    哈喽,大家好,我是木头左!一、引言在Java编程中,经常会遇到需要复制一个对象的属性到另一个对象的情况。这时,可以使用浅拷贝(ShallowCopy)来实现这个需求。那么,什么是浅拷贝呢?浅拷贝是指创建一个新对象,然后将原对象的非静态字段复制到新对象中。这样,新对象和原对象就会有相同的字段......
  • JAVA每日作业day5.29
    依旧是活力满满的一天奥老铁们。今天学习了数组,数组包括了以下方面:1.动态初始化:自己定义数组的长度,系统决定初始值。2.静态初始化:自己决定数组的初始值,系统决定长度。3.数组的的索引:索引从0开始并逐一增加(每次加1),我们要存储数组的数据时,要用索引来存储,话不多说上代码。......
  • java中String、List、数组之间的转换方式
    在Java中,String、List和数组(如String[])之间的转换是常见的操作。下面是如何在它们之间进行转换的示例。1.String转List通常,你不会直接将一个完整的String转换为List,但你可以将包含多个元素的字符串(如由逗号分隔的字符串)分割成多个部分,并将这些部分添加到List中。Str......
  • 5.29_Java程序流程控制
    CSDN   同C语言的流程同1、补充:1、switch使用时的注意事项1、表达式只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、longswitch里面是做分支匹配,也就是可以出现很多分支,如果弄得范围很大,不可能出现这么多分支,int的范围都很......