2016-09-20 4 views
2

외부 구성 특성에 의해 오라클 생산 데이터베이스 연결에 대한 다시 시도 횟수 설정하는 방법은 Spring에 새로운 오전과 나는 우리의 Spring Boot Java Application와 관련된 Oracle에 대한 retry attempts을 설정하고 싶습니다. 나는 spring.datasource 속성이 application.yml 파일 안에 지정되어 있습니다.봄 부팅 : spring.datasource

데이터 소스 : 나는 목록 일반적인 봄 부팅 특성을 제공이 link을 대해 참조했지만 나는 봄 부트 데이터 소스에 대한 재시도 수를 설정 속성을 찾을 수 없습니다

driverClassName: oracle.jdbc.driver.OracleDriver 
url: "jdbc:oracle:thin:@//xxx-xxx-x-xxx:1521/database" 
username: scott 
password: tiger 

. 연결에 실패하면 스프링 부트가 자동으로 재시도합니까? 데이터 소스에 대한 재시도 횟수를 설정하는 것이 합리적입니까?

나는 종종 connection reset 오류가 발생하므로 재시도 시도를 추가하여 연결 실패시 재 시도하려고합니다. 다음은 스택 추적입니다.

java.sql.SQLRecoverableException: IO Error: Connection reset 
     at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:682) ~[ojdbc7-12.1.0.1.jar!/:12.1.0.1.0] 
     at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715) ~[ojdbc7-12.1.0.1.jar!/:12.1.0.1.0] 
     at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385) ~[ojdbc7-12.1.0.1.jar!/:12.1.0.1.0] 
     at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30) ~[ojdbc7-12.1.0.1.jar!/:12.1.0.1.0] 
     at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564) ~[ojdbc7-12.1.0.1.jar!/:12.1.0.1.0] 
     at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:307) ~[tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:200) ~[tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:708) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:642) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:464) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:141) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126) [tomcat-jdbc-8.0.33.jar!/:na] 
     at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.engine.jdbc.internal.JdbcServicesImpl$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcServicesImpl.java:279) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:124) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857) [hibernate-entitymanager-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) [hibernate-entitymanager-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425) [hibernate-core-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849) [hibernate-entitymanager-4.3.11.Final.jar!/:4.3.11.Final] 
     at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) [spring-orm-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:343) [spring-orm-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:319) [spring-orm-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1054) [spring-context-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:829) [spring-context-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) [spring-context-4.2.6.RELEASE.jar!/:4.2.6.RELEASE] 
     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.5.RELEASE.jar!/:1.3.5.RELEASE] 
     at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.5.RELEASE.jar!/:1.3.5.RELEASE] 
     at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.5.RELEASE.jar!/:1.3.5.RELEASE] 
     at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134) [spring-boot-1.3.5.RELEASE.jar!/:1.3.5.RELEASE] 

답변

0

이것은 연결 풀의 기능입니다. 의견이 없으면 we do have one입니다.

당신은 아마 내가 다시 시도 생각하지 않는다 its documentation

을 확인 톰캣 데이터 소스를 사용하여 문제를 해결하는 방법입니다. 유효하지 않은 연결이 있고 풀에서 반환하기 전에 유효성을 검사하지 않습니다. 스프링 부트 1.4는 기본적으로이를 수행합니다. 1.3 이상인 경우 this answer에 몇 가지 추가 정보가 있습니다.

+0

감사합니다. 예'Spring Boot 1.3.5'를 사용하고 있습니다. 'spring.datasource.testOnBorrow'와'spring.datasource.validationQuery'는 prod 상자에서 권장되지 않습니다. –

1

쉬운 연결 대신 긴 양식 연결 URL을 사용하는 것이 좋습니다. RETRY_COUNT 및 RETRY_DELAY와 같은 연결 설명자를 전달할 수 있습니다. 샘플 연결 URL은 다음과 같습니다.

JDBC 오라클 : 얇은 : (DESCRIPTION @ = (CONNECT_TIMEOUT = 15) (RETRY_COUNT = 20) (RETRY_DELAY = 3) (ADDRESS_LIST = (LOAD_BALANCE = ON) (ADDRESS = (PROTOCOL = TCP) (HOST = primaryscan) (PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = myorcldbservicename)))

CONNECT_TIMEOUT :이 기능을 사용하도록 설정 한 경우,이 매개 변수는에 (지정된 시간 (초) 15 초를 기다려야 오라클 넷 서비스를 지시 이 예제는 연결 설정 완료를위한 것입니다. 이것은 클라이언트가 oracle 데이터베이스 인스턴스에 대한 연결을 설정하는 시간을 지정하는 SQLNET.OUTBOUND_CONNECT_TIMEOUT과 같습니다. CONNECT_TIMEOUT은 SQLNET.OUTBOUND_CONNECT_TIMEOUT을 대체합니다.

RETRY_COUNT : 클라이언트에 오류 메시지를 반환하기 전에 네트워크 연결 재 시도 횟수를 지정합니다. 위의 예제에서, Oracle Net은 오류 메시지를 클라이언트에 리턴하기 전에 3 번 재 시도합니다. 이렇게하면 연결 가능성이 높아져 성능이 향상됩니다.

RETRY_DELAY :이 매개 변수는 다시 연결 시도 사이의 대기 시간 (초)을 지정합니다. RETRY_COUNT와 함께 작동합니다. 따라서 RETRY_DELAY와 RETRY_COUNT를 함께 사용하여 불필요한 CPU 사이클을 피하는 것이 좋습니다.

+1

스프링 부트가 이것을 지원합니까? 스프링 부트 응용 프로그램으로이 옵션을 사용할 수 있는지 확실하지 않습니까? –

+0

이 RETRY_COUNT에 대한 자세한 내용은 https://community.oracle.com/thread/4056866 및 공식 문서 (Oracle 12의 경우에도 계속 작동) https://docs.oracle.com/ database/121/JJDBC/appcontnew.htm # JJDBC29073 – Hoto