我需要在SpringBoot应用程序(嵌入式tomcat)中为ibatis建立jdbctemplate的数据库连接故障转移,该数据库使用c3p0进行连接池。以下是我的应用程序的applicaiton.properties。我有主数据库和辅助数据库。运行时中的数据库连接故障转移。请帮助我实现这一目标。我尝试在配置中包含多个数据库URL,但无法正常工作。
c3p0 Java Database Pooling, failover configuration
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
最佳答案
据我所知,故障转移配置取决于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配置故障转移的更多详细信息,请参见以下链接:tnsnames.ora
的位置请注意,所有数据库上的服务名称都必须相同,因此我将配置中的
db1
和db2
替换为db
。如果要使用不同的服务名称,则必须以编程方式配置单独的数据源(如Sheetal Mohan Sharma所述)。
编辑:
CONNECTION_WITH_FAILOVER =
(说明=
(ADDRESS_LIST =
(地址=(协议(protocol)= TCP)(主机= primary.com)(端口= 1521))
(地址=(协议(protocol)= TCP)(主机= secondary.com)(端口= 1521))
(LOAD_BALANCE =否)
(FAILOVER =是)
)
(CONNECT_DATA =
(服务器=专用)
(SERVICE_NAME = db1)
(FAILOVER_MODE =
(TYPE =选择)
(方法=预连接)
(重试= 180)
(延迟= 10)
(备份= db2)
)
)
)
并作为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))))
CONNECTION_WITH_FAILOVER =
(说明=
(ADDRESS_LIST =
(地址=(协议(protocol)= TCP)(主机= google.com)(端口= 1521))
(地址=(协议(protocol)= TCP)(主机=我的实际数据库)(端口=我的数据库端口))
(LOAD_BALANCE =否)
(FAILOVER =是)
)
(CONNECT_DATA =
(服务器=专用)
(SERVICE_NAME =我的服务名称)
(FAILOVER_MODE =
(TYPE =选择)
(方法=预连接)
(重试= 1)
(延迟= 1)
)
)
)
模拟主要连接失败(因为显然没有在google.com上运行Oracle数据库),并使用连接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))))
而且效果也很好,尽管两次建立连接都花了一些时间(但这可能与我的网络配置或驱动程序的连接超时值有关)
FAILOVER_MODE
参数以满足您的需要-特别考虑RETIRES和DELAY值-在我提供的示例中,我使用了180次重试,两次重试之间有10秒的延迟,此外每次重试的连接超时都可能需要驱动程序实际切换到故障转移连接之前的时间很长。