当前位置: 首页 > 知识库问答 >
问题:

带有c3p0数据库池和故障转移的Spring Boot JDBCTemplate

秦才
2023-03-14

c3p0 Java数据库池,故障转移配置https://docs.genesys.com/documentation/composer/8.1.4/help/connectionPooling

application.properties:(出现错误)

#      connection properties for data source
##########################################################################################################
spring.datasource.c3p0.driverClass=oracle.jdbc.driver.OracleDriver
spring.datasource.c3p0.maxConnectionAge=3600
spring.datasource.c3p0.maxIdleTime=600
spring.datasource.c3p0.initialPoolSize=5
spring.datasource.c3p0.maxPoolSize=10
spring.datasource.c3p0.minPoolSize=5
spring.datasource.c3p0.acquireIncrement=1

##########################################################################################################


spring.datasource.url=jdbc:oracle:thin:@primary.com:1521:db1,jdbc:oracle:thin:@secondary.com:1521:db2
spring.datasource.username=user
spring.datasource.password=password

共有1个答案

司徒耀
2023-03-14

据我所知,故障转移配置依赖于JDBC驱动程序。对于Oracle,您可以使用连接描述符对其进行配置。因此,在您的示例中,可以将其放在tnsnames.ora中:

CONNECTION_WITH_FAILOVER = 
    (DESCRIPTION =
        (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = primary.com)(PORT = 1521))
            (ADDRESS = (PROTOCOL = TCP)(HOST = secondary.com)(PORT = 1521))
            (LOAD_BALANCE = no)
            (FAILOVER = yes)
        )
        (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = db)
            (FAILOVER_MODE =
                (TYPE = select)
                (METHOD = preconnect)
                (RETRIES = 180)
                (DELAY = 10)
            )
        )
    )

然后在您的配置中:

spring.datasource.url=jdbc:oracle:thin:@CONNECTION_WITH_FAILOVER 

当然,您可能没有或不想使用tnsnames.ora,在这种情况下,可以使用连接描述符作为JDBC连接字符串的一部分:

spring.datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=primary.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=secondary.com)(PORT=1521))(LOAD_BALANCE=no)(FAILOVER=yes))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db)(FAILOVER_MODE=(TYPE=select)(METHOD=preconnect)(RETRIES=180)(DELAY=10))))

有关连接描述符、tnsnames.ora和为Oracle DB配置故障转移的详细信息,请参阅以下链接:

  • 本地命名参数
  • Oracle和OCI&JDBC连接字符串
  • tns_admin-用于配置tnsnames.ora
  • 的位置
  • Oracle DB(pdf)中故障转移模式的说明-包含参数failover_mode的说明

注意,所有数据库上的服务名称必须相同,因此我将配置中的 db1db2替换为 db.

>

  • 得到的错误表示您试图连接到服务器上不存在的服务名称-详细信息请参阅
  • 我今天更仔细地重读了文档(特别是我在上面链接的PDF),似乎可以在连接字符串中指定辅助服务名称,因此在您的示例中,Tnsnames.ora中的条目应该是:

    CONNECTION_WITH_FAILOVER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=primary.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=secondary.com)(PORT=1521))(LOAD_BALANCE=no)(FAILOVER=yes))(CONNECT_DATA=(SERVER=definition)(SERVICE_NAME=db1)(FAILOVER_MODE=(TYPE=select)(METHOD

    并作为application.properties中的JDBC URL:

    spring.datasource.url=jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=primary.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=secondary.com)(PORT=1521))(LOAD_BALANCE=no)(FAILOVER=yes))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db1)(FAILOVER_MODE=(TYPE=select)(METHOD=preconnect)(RETRIES=180)(DELAY=10)(BACKUP = db2))))
    

    >

  • 我目前没有配置这样的设置,所以我把它放在我的tnsnames.ora中:

    CONNECTION_WITH_FAILOVER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=google.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=my-actural-database)(PORT=my-db-port))(LOAD_BALANCE=no)(FAILOVER=yes))(CONNECT_DATA=(SERVER=disional)(SERVICE_NAME=my-service-name)(FAILOVER_MODE=(TYPE=

    模拟主连接失败(因为Google.com上显然没有运行Oracle DB),并设法使用连接URL:jdbc:Oracle:thin:@connection_with_failover用DataGrip连接到我的数据库

    我还直接在JDBC URL中使用连接描述符进行了尝试:

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=google.com)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=my-actual-database)(PORT=my-db-port))(LOAD_BALANCE=no)(FAILOVER=yes))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=my-service-name)(FAILOVER_MODE=(TYPE=select)(METHOD=preconnect)(RETRIES=1)(DELAY=5))))
    

    它同样有效,尽管这两次都需要相当长的时间来建立连接(但这可能与我的网络配置或驱动程序的连接超时值有关)

      null

  •  类似资料:
    • 问题内容: 在JBoss数据源中,如何为我想要的数据库故障转移提供多个连接字符串。 将有两个具有相同表的Mysql db,即DB1和DB2。我想将数据插入DB1,如果DB1关闭,那么我需要将其插入DB2。在插入DB2期间,如果DB1出现了,我需要将其余数据插入DB1中。如何在JBoss中配置它? 问题答案: 这将适用于jboss映射

    • 问题内容: 在简单情况下,如果3台服务器具有1个主服务器和2个从属服务器而没有分片。是否有使用Java和Jedis的经过验证的解决方案,该解决方案没有单点故障,并且将自动处理单个服务器(无论是主服务器还是从服务器)(自动故障转移)。例如,提升主机并在故障后重置,而不会丢失任何数据。 在我看来,这似乎应该是一个已解决的问题,但是我找不到关于它的任何代码,而仅是对实现此方法的高级描述。 谁实际覆盖并在

    • 对于复制,我们设置Server1作为主服务器,设置server2作为次服务器...一切正常。 期望:当server1停机时,次要的server2不会自动变成主要的。它仍然是次要的。server2也有可能自动成为主服务器。 情况2:MongoDB复制是否需要3台强制服务器,以便当server1宕机时,server2将自动成为主要服务器,server3将保持次要服务器。(这很管用)

    • 问题内容: 对于J2EE容器 之外 的Java应用程序,哪个连接池库是最好的? 我听说c3p0已经过时了。 雅加达的公共池库已不再开发 因此,我只剩下BoneCP和DBPool了。从我可以看出,两者活动有限。我可以看到的主要区别是性能,BoneCP似乎可以与之抗衡。但是,文档非常薄弱。 您在现实世界中使用了哪个数据库池库,为什么?好的和坏的是什么? 问题答案: 在工作中,我们使用了BoneCP(作

    • 我们使用MQ作为传递消息的主要路径。这是我们的制度运作不可或缺的一部分。消息代理有时会失败,所有相关的队列也会随之失败。在camel中,有没有一种方法可以启动故障切换,并在其启动时恢复到主故障切换?

    • 我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运