2012-04-01 4 views
0

후에 닫히고 난의 context.xml 파일 내부에이 방법을 configued 한 이유데이터베이스 연결은 내가 바람둥이 6 연결 풀링을 사용하고 모든 작업

<Resource name="jdbc/myoracle" auth="Container" 
       type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 
       url="jdbc:oracle:thin:@127.0.0.1:1521:ORCLE" 
       username="scott" password="tiger" maxActive="20" maxIdle="10" 
       maxWait="-1"/> 

그리고이 데이터 소스를 사용하여 연결을 얻기 위해 내 공장 클래스입니다

public class ConnPoolFactory { 
    private static DataSource dataSource; 
    private static Connection connection; 

    private ConnPoolFactory() { 
    } 

    public static synchronized Connection getConnection() throws SQLException { 

     try { 

      if (connection == null) { 
       Context initContext = new InitialContext(); 
       Context envContext = (Context) initContext 
         .lookup("java:/comp/env"); 
       dataSource = (DataSource) envContext.lookup("jdbc/myoracle"); 
       connection = dataSource.getConnection(); 
      } else { 
       return connection; 
      } 

     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

     return connection; 

    } 
} 

그리고 마지막으로 블록 안에 내 서블릿에서

, 나는 그것을 이런 식으로

try { 

connection = ConnPoolFactory.getConnection(); 
finally 

{ 

if(conn!=null) 
con.close(); 
} 
을 폐쇄하고3210

제 사용자 인터페이스에서 삽입, 업데이트, 삭제, 선택 -과 같은 다른 명령 (버튼 누름)을 줄 수 있습니다.

내가 직면 한 문제는 응용 프로그램이 한 명령 만 실행한다는 것입니다. 예를 들어 삽입 단추를 클릭하면 레코드가 제대로 삽입되고 그 후에 다시 명령을 내릴 수 있습니다. 연결이 닫혔다는 서버 콘솔의 예외.

난 결국 내 서블릿 내부 코드를 차단하는 것이 제거하는 경우는, 다음 응용 프로그램은

아무도 finnaly 차단 무슨 잘못이와 함께 알려 주시기 바랍니다 수 명령의 수에 대해 잘 실행 ??

+2

닫기를 호출 한 후 연결이 닫히는 이유는 무엇입니까? – Mat

답변

1

ConnPoolFactoryConnection 변수는 정적이 아닌 메소드 로컬이어야합니다. null에 대해 테스트해야하는 변수는 connection이 아니라 dataSource입니다. null이 아닌 값을 얻었 으면 dataSource.getConnection()을 반환합니다. 호출자는 작업이 끝나면 연결을 닫아야합니다.

0

공장에서는 연결이 끊겼다는 것을 인식하지 못하고 계속 넘겨줍니다. 나는 그것이 당신이 그것을 염두에두고 설계 한 것이라고 가정하고 있습니다.

서블릿을 사용하면 연결을 되돌리거나 공장에서 매번 새로운 연결을 만들어야합니다.

편집 : 더 명시 적 노력은 :

서블릿 코드는 한 번 요청에 따라 호출됩니다. 그것이 서블릿이하는 일입니다. 어떤 요청이 있은 후에도 연결을 끊는 것 같습니다. 벌금. 그러나 연결 팩토리는 작성한 연결을 정적으로 저장합니다. 따라서 두 번째 호출에서는 이미 닫혀있는 연결을 넘겨줍니다 (사실상 공장이 아닌 단일 연결의 연결 풀입니다).

연결을 종료하지 않으면 다른 nastier 버그가 발생할 수 있습니다. 두 개의 요청이 동시에 발생하면 서블릿 스레드간에 연결을 공유하게되며, 수행하는 DB 작업에 따라 작동하지 않을 수 있습니다.

+0

내 코드에서 anythig가 잘못 표시되지 않습니다. 나는 내 진술에 맞는 것 같아. – Pawan

+0

단위 테스트에서 시도해보십시오. Connection c = ConnPoolFactory.getConnection(); c.close(); c = ConnPoolFactory.getConnection(); // 연결을 사용합니다. – ptyx

관련 문제