2016-10-11 3 views
0

Oracle 풀링 연결에 oracle.jdbc.pool.OracleDataSource을 사용하고 있지만 연결이 데이터베이스에 남아있는 것으로 보입니다. 오라클 데이터베이스에 연결하는 동안 오늘 나는 오류가 발생했습니다 :스프링 Oracle 데이터 소스로 연결이 끊어지지 않습니다.

ORA-12516 : TNS : 리스너가 일치하는 프로토콜 스택

사용할 핸들러를 찾을 수 없습니다 그리고 나는 우리의 데이터베이스 관리자가 들었다 너무 많은 것을 열려있는 연결은 내 애플리케이션에서 "유휴"모드로 유지됩니다.

나는 ojdbc7 사용

<dependency> 
    <groupId>com.oracle</groupId> 
    <artifactId>ojdbc7</artifactId> 
    <version>12.1.0.1</version> 
</dependency> 

봄 applicationContext.xml 파일 :

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
    <property name="URL" value="${jdbc.url}" /> 
    <property name="user" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
    <property name="connectionCachingEnabled" value="true" /> 
</bean> 

DbConnect 클래스 :

import java.sql.Connection; 
import java.sql.SQLException; 
import javax.sql.DataSource; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 

@Repository 
public class DbConnect { 

    @Autowired 
    private DataSource dataSource; 

    public Connection getConnection() throws SQLException { 
     return dataSource.getConnection(); 
    } 
} 

이 또한 내가 시도 --자원과 jdk7 구문 사용 연결에 대한 내 DAO 수준 :

@Autowired 
private DbConnect dbConnect; 

public List<User> getAllUsers() { 
    List<User> list = new ArrayList<>(); 

    try(Connection connection = dbConnect.getConnection()) { 
     try(PreparedStatement preparedStatement = connection.prepareStatement("select * from V_USERS t")) { 
      try(ResultSet resultSet = preparedStatement.executeQuery()) { 
       while(resultSet.next()) { 
        list.add(RowFetcher.fetchUser(resultSet)); 
       } 
      } 
     } 
    } 
    catch(Exception e) { 
     log.error(e.getMessage(), e); 
    } 

    return list; 
} 

실제 문제가 어디인지 알 수 없습니다. OracleDataSource 대신 c3p0을 사용해야합니까? ojdbc7에 버그가 있거나 내 코드에 오류가 있습니까?

미리 감사드립니다.

+1

'DbConnect'에 대한 코드를 게시해야합니다. –

+0

게시물을 편집했습니다.변경 사항을 참조하십시오 – 0bj3ct

+0

dba가 생각하는 연결 수와 Oracle 데이터 소스의 기본 설정은 무엇입니까? – KarlP

답변

1

작동 .T 다른 데이터 소스 org.apache.commons.dbcp.BasicDataSource를 사용합니다. 그러나 OracleDataSource이 실제 풀이거나 OracleConnectionPoolDataSource이 필요한지 확실하지 않습니다.

일반 Oracle 풀을 사용하는 대신 HikariCP을 사용하는 것이 좋습니다. 페이지는 configuration options이고 기본값입니다.

는이 경우 귀하의 데이터 소스는

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> 
    <property name="datasourceClassName" value="oracle.jdbc.pool.OracleDataSource" /> 
    <property name="dataSourceProperties"> 
     <props> 
      <prop key="URL" value="${jdbc.url}" /> 
      <prop key="user" value="${jdbc.username}" /> 
      <prop key="password" value="${jdbc.password}" /> 
      <prop key="connectionCachingEnabled" value="true" /> 
     </props> 
    </property> 
</bean> 

참고과 같습니다 풀 크기에 또한 좋은 page있다 (Oracle에서 실제로이다!).

또한 코드를 정리하고 DbConnect 클래스를 제거하고 일반 연결로 작업하는 대신 JdbcTemplate을 삽입 (또는 생성)하는 것이 좋습니다. 모든 JDBC 객체 관리를 저장합니다.

private final JdbcTemplate jdbcTemplate; 

@Autowired 
public YourRepository(DataSource ds) { 
    this.jdbcTemplate=new JdbcTemplate(ds); 
} 

public List<User> getAllUsers() { 
    List<User> list = new ArrayList<>(); 
    return this.jdbcTemplate("select * from V_USERS t", new RowMapper() { 
     public User mapRow(ResultSet rs, int row) throws SQLException { 
      return RowFetcher.fetchUser(rs); 
     } 
    }); 
} 
+0

완벽한 답변을 보내 주셔서 감사합니다. 매우 도움이되었습니다. HikariCP와 Spring JdbcTemplate을 사용할 것입니다. – 0bj3ct

2

데이터 소스 제한 등록 정보를 설정하여 캐시 크기를 제어 할 수 있습니다.

<property name="connectionCacheProperties"> 
    <props> 
    <prop key="MinLimit">${jdbc.limit.min}</prop> 
    <prop key="MaxLimit">${jdbc.limit.max}</prop> 
    <prop key="InitialLimit">${jdbc.limit.init}</prop> 
    </props> 
</property> 
+0

이것은 가장 가능성있는 해결책입니다. MaxLimit는 기본값 '0'이며 무제한입니다. – KarlP

0

봅니다 풀의 요점은 열려있는 연결을 유지하는 것입니다 나를

1

Java 연결 풀인 UCP (Universal Connection Pool)가 있습니다.
자세한 구성 정보는 UCP with Spring을 참조하십시오.

관련 문제