You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用HikariCP连接Oracle时池初始化失败ORA-00923错误求助

HikariCP初始化失败:ORA-00923错误排查与解决

嘿,我来帮你搞定这个问题!你用JdbcTemplate批量插入数据时遇到了HikariCP初始化失败的异常,核心错误是ORA-00923: FROM关键字未在预期位置找到,结合你的Spring配置来看,问题根源其实很明确。

先把你的配置和异常信息整理一下,方便分析:

你的Spring配置

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
<property name="poolName" value="springHikariCP" /> 
<property name="connectionTestQuery" value="SELECT 1" /> 
<property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource" /> 
<property name="maximumPoolSize" value="30" /> 
<property name="idleTimeout" value="30000" /> 
<property name="dataSourceProperties"> 
<props> 
<prop key="url">jdbc:oracle:thin:@localhost:1521:orcl</prop> 
<prop key="user">TEST</prop> 
<prop key="password">TEST</prop> 
</props> 
</property> 
</bean> 
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> 
<constructor-arg ref="hikariConfig" /> 
</bean> 
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
<property name="dataSource" ref="dataSource"></property> 
</bean> 
<bean id="HikariCpSample" class="com.ignite.sample.clustering.HikariCpSample"> 
<property name="jdbcTemplate" ref="jdbcTemplate"></property> 
</bean>

触发的异常

主线程异常:org.springframework.beans.factory.BeanCreationException: 创建类路径资源[spring.xml]中定义的名为'dataSource'的Bean出错:通过构造函数实例化Bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException: 实例化[com.zaxxer.hikari.HikariDataSource]失败:构造函数抛出异常;嵌套异常为com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: 初始化池失败:ORA-00923: FROM关键字未在预期位置找到

问题原因

你配置的connectionTestQuery值是SELECT 1,但Oracle数据库不支持这种无FROM子句的查询语法,Oracle要求所有SELECT语句必须包含FROM子句,正确的连接测试语句应该是SELECT 1 FROM DUAL。HikariCP在初始化连接池时,会执行这个测试语句来验证数据库连接的有效性,执行不合法的SQL就触发了ORA-00923错误。

解决方法

有两种方案可以解决这个问题:

方案1:修正connectionTestQuery语句

connectionTestQuery的属性值改成Oracle支持的语法:

<property name="connectionTestQuery" value="SELECT 1 FROM DUAL" />

方案2:移除connectionTestQuery配置(推荐)

对于Oracle 12c及以上版本,HikariCP可以自动识别数据库类型并使用内置的连接验证机制,不需要手动指定connectionTestQuery。直接删掉这个配置项,HikariCP会自动处理连接验证,这样更简洁也不容易出错。

额外检查点

  • 确认你的Oracle驱动版本和HikariCP版本兼容:比如HikariCP 4.x需要Java 8+,推荐使用ojdbc8或更高版本的驱动
  • 再次核对数据库URL、用户名和密码是否正确,确保能直接用这些信息连接到Oracle实例

修改后的配置示例(以方案2为例):

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
<property name="poolName" value="springHikariCP" /> 
<!-- 移除connectionTestQuery配置 -->
<property name="dataSourceClassName" value="oracle.jdbc.pool.OracleDataSource" /> 
<property name="maximumPoolSize" value="30" /> 
<property name="idleTimeout" value="30000" /> 
<property name="dataSourceProperties"> 
<props> 
<prop key="url">jdbc:oracle:thin:@localhost:1521:orcl</prop> 
<prop key="user">TEST</prop> 
<prop key="password">TEST</prop> 
</props> 
</property> 
</bean> 

按照上面的方法修改后,重新启动应用,应该就能正常初始化HikariCP连接池了。

内容的提问来源于stack exchange,提问作者newcoder

火山引擎 最新活动