SpringBoot连接Oracle12c以上版本PDB的解决思路
1. 最近公司产品改⽤springboot开发, 要⽀持企业级⼤型数据库Oracle ,并且版本要求⽐较⾼,需要使⽤Oracle12c以上.
⼜因为Oracle 12c 以上有了⼀个PDB的可插拔数据库的概念. 之前公司同事要求使⽤⾮PDB模式进⾏建账套使⽤, 所以最近的很多机器都是简单的non-PDB模式的.
这⼏天有同事⾃⾏搭建数据库, 使⽤了PDB模式,结果发现springboot注册数据库时报错,经过⾃⼰的搜索和实验, 问题和思路主要如下:
2. 问题现象. 注册完数据库之后,
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:oracle:thin:@10.24.14.56:1521:pdbora12c^M
driver-class-name: oracle.jdbc.driver.OracleDriver^M
username: gscloud^M
password: Test6530^M
启动会报错:
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
jdbc连接oracle
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:854) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.jdbc.t(PhysicalConnection.java:793) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.jdbc.Connection(T4CDriverExtension.java:57) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.jdbc.t(OracleDriver.java:747) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.jdbc.t(OracleDriver.java:562) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at com.zaxxer.hikari.Connection(DriverDataSource.java:136) ~[HikariCP-3.2.0.jar!/:na]
at com.zaxxer.hikari.wConnection(PoolBase.java:369) ~[HikariCP-3.2.0.jar!/:na]
at com.zaxxer.hikari.wPoolEntry(PoolBase.java:198) ~[HikariCP-3.2.0.jar!/:na]
at com.zaxxer.hikari.atePoolEntry(HikariPool.java:467) [HikariCP-3.2.0.jar!/:na]
at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541) [HikariCP-3.2.0.jar!/:na]
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-3.2.0.jar!/:na]
at com.zaxxer.Connection(HikariDataSource.java:112) [HikariCP-3.2.0.jar!/:na]
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) [spring-jdbc-5.2.0.RELEASE.jar!/:5.2.0.RELEASE]
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) [spring-jdbc-5.2.0.RELEASE.jar!/:5.2.0.RELEASE]
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:226) [spring-jdbc-5.2.0.RELEASE.jar!/:5.2.0.RELEASE]
at com.sun.proxy.$Proxy696.prepareStatement(Unknown Source) [na:na]
解决思路:
替换连接字符串为:
修改点有两处:
1. @后⾯添加两个正斜线
2.端⼝号后⾯将之前的冒号修改为正斜线.
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:oracle:thin:@//10.24.14.56:1521/pdbora12c^M
driver-class-name: oracle.jdbc.driver.OracleDriver^M
username: gscloud^M
password: Test6530^M
3. 再次启动
验证服务能够正常启动起来.
这⾥⾯转帖⼀下别⼈对SID和SERVICE_NAME的简单说明.
3.1 java连接Oracle数据库的三种格式:
格式⼀:jdbc:oracle:thin:@//<host>:<port>/<service_name>
格式⼆:jdbc:oracle:thin:@<host>:<port>:<SID>
格式三:jdbc:oracle:thin:@<TNSName>
3.2 service_name 和sid的区别:
Service_name:该参数是由oracle8i引进的。在8i以前,使⽤SID来表⽰标识数据库的⼀个实例,但是在Oracle的并⾏环境中,⼀个数据库对应多个实例,这样就需要多个⽹络服务名,设置繁琐。为了⽅便并⾏环境中的设置,引进了Service_name参数sid是数据库实例的名字,每个实例各不相同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。