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



我有一个使用扫描地址连接到数据库的应用程序。在此扫描地址下有两个相同的数据库Oracle实例。如果一个实例因某种原因关闭或崩溃,应用程序应自动恢复,并尝试连接到数据库的另一个工作实例。

我使用HikariCP、Hibernate、jdbc:瘦客户端和Oracle数据库。

我应该强制检查到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>

有多种因素需要考虑:

  • HikariCP在将每个连接借用到应用程序之前都会检查它。除非两次借用之间有不到10秒的延迟。

  • Oracle的JDBC驱动程序实现了以下功能:应用程序连续性(AC(。JDBC驱动程序会记住在事务打开时发送到数据库的插入/更新。当您断开这个连接时,JDBC驱动程序会透明地重新连接并重放SQL。此功能有一些局限性,但在基本情况下,即使在事务尚未提交的情况下,数据也不会丢失。

  • Oracle在JDBC 4.x标准中引入了一些方便的功能。其中之一是CCD_ 1。在Oracle的案例中,is做了与OCPing相同的事情。它在应用程序和数据库服务器之间交换单个数据包往返。在每次连接借用时都要执行一个特定的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集群的事件,可以负载平衡节点之间的连接。可以在请求时关闭与特定数据库节点的连接。如果配置得当,您甚至可以实现数据库服务器零停机补丁。

最新更新