oracle 如何检查数据库连接并在需要时重新连接?

woobm2wo  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(178)

我有一个使用扫描地址连接到数据库的应用程序。在此扫描地址下有两个相同的数据库Oracle示例。如果一个示例由于某种原因关闭或崩溃,应用程序应该自动恢复并尝试连接到数据库的其他工作示例。
我使用HikariCP,Hibernate,jdbc:瘦客户端和Oracle DB。
我应该强制检查哪一个到DB的连接是否是活动的,如果不是,则尝试建立新的连接?
两个数据库示例上方的扫描地址工作正常。当我的应用程序崩溃并刷新页面时,它会自动在其他工作数据库上创建一个连接池,但我需要自动完成此过程。
我使用Hikari xml配置:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="minimumIdle" value="${jdbc.minPoolSize:0}" />
    <property name="maximumPoolSize" value="${jdbc.maxPoolSize:10}" />
    <property name="idleTimeout" value="${jdbc.maxIdleTimeSeconds:10000}" />
</bean>
uttx8gqw

uttx8gqw1#

有各种事情要考虑:

  • HikariCP在将连接借用到应用程序之前会检查每个连接。除非两次借用之间的延迟小于10秒。
  • Oracle的JDBC驱动程序实现以下功能:应用连续性(AC)。当事务打开时,JDBC驱动程序记住发送到数据库的插入/更新。当您松开此连接时,JDBC驱动程序将透明地重新连接并重放SQL。此功能有一些限制,但在基本情况下,即使在事务尚未提交的情况下,数据也不会丢失。
  • Oracle在JDBC 4.x标准中引入了一些方便的特性。其中一个是Connection.isValid()。在Oracle的情况下,它与OCIPing做同样的事情。它在应用程序和数据库服务器之间交换单个数据包往返。在每个连接借用上执行特定的SQL属于过去-今天有更好的方法。
  • 只要执行你的JDBC驱动程序,它就会告诉你它支持的JDBC版本。
$ java -jar ojdbc8.jar
Oracle 12.2.0.1.0 JDBC 4.2 compiled with javac 1.8.0_91 on Tue_Dec_13_06:08:31_PST_2016
#Default Connection Properties Resource
#Mon Jun 10 20:13:17 CEST 2019
  • 除了HikariCP,您还可以使用Oracle的UCP。该连接池库实现可以接收来自RAC集群的事件,可以对节点之间的连接进行负载均衡。可以在请求时关闭到特定DB节点的连接。如果配置正确,您甚至可以实现零停机DB服务器修补。

相关问题