2014-03-07 3 views
1

그래서 나는 무한정으로 TCP 서버 (다른 프로세스로부터 메시지를 받고 onMsg 처리기를 가짐)로 실행되는 자바 프로세스를 가지고있다.언제 데이터베이스 연결을 닫아야합니까? (자바)

자바 프로그램에서 메시지와 함께하고 싶은 일 중 하나는 포스트 그레스에 데이터베이스 연결을 사용하여 디스크에 쓰는 것입니다. 지금은 메시지가 들어올 때마다 호출하는 하나의 정적 연결 개체가 있습니다. 각 메시지에 대한 연결을 닫았다가 다시 열지 않습니다.

저는 아직 Java에 익숙하지 않습니다. 하나의 연결 개체를 무기한으로 열어 놓은 함정이나 위험이 있는지, 1) 연결을 닫지 않는 것이 성능상의 이점이 있는지, 다시 열거 나 닫을 때마다 데이터베이스에 충돌하고 싶습니다.

도움 주셔서 감사합니다.

+0

[this] (http://stackoverflow.com/questions/3332074/what-are-the-disadvantages-of-using-persistent-connection-in-pdo) 답변을 확인하십시오. 이것은 PHP 용이지만 여전히 불필요하게 연결을 열어 두는 것이 왜 나쁜지에 대한 대답입니다. –

답변

6

각 메시지의 연결을 닫았다가 다시 열지 마십시오.

예 ... 적어도 평야 인 경우 Connection 개체가 관련되어 있습니다. 그렇지 않으면 끊어진 연결로 끝나게되면 영원히 끊어지며 여러 작업을 동시에 수행해야하는 경우 문제가 발생합니다.

원하는 것은 연결 풀이 데이터베이스에 대한 "실제"연결을 관리하는 것이며 각 작업마다 풀에서 연결을 요청하고 작업이 끝나면 닫습니다. "논리적"연결을 닫으면 다른 작업을 위해 풀에 "실제"연결이 반환됩니다. (풀은 하트 비트가있는 연결을 유지하고 시간이 지남에 따라 연결이 끊어지는 등을 처리 할 수 ​​있습니다.)

"일반"JDBC를 사용했기 때문에 많은 연결 풀 기술을 사용할 수 있었고 오랜 시간이 걸렸습니다. 현재 예술 수준이 어디인지는 밝히지 않겠지 만 직접 연구 할 수는 있습니다. :)

3

데이터베이스 연결을 만드는 것은 항상 성능 저하입니다. 매우 순진한 구현 만이 각 작업에 대한 연결을 만들고 닫을 수 있습니다. 한 시간에 한 번만 뭔가를해야한다면 받아 들여질 것입니다.

그러나 분당 여러 데이터베이스 액세스 (또는 더 큰 응용 프로그램의 경우 초당)를 수행하는 프로그램이 있으면 실제로 연결을 닫으 려하지 않습니다.

그래서 언제 연결을 닫으시겠습니까? 쉬운 대답 : 연결 풀에서 처리하도록하십시오. 풀에 연결을 요청하면 열려있는 연결 (캐시되었거나 정말로 필요한 경우 새 연결)이 제공됩니다. 쿼리가 끝나면 close() 연결이 있지만 실제로는 풀에 대한 연결 만 반환합니다.

매우 간단한 프로그램의 경우 연결 풀을 설정하는 것이 추가 작업 일 수 있지만 그다지 어렵지는 않을 것입니다. Apache의 DBCP3CPO과 같은 몇 가지 오픈 소스 연결 풀이 있습니다.

관련 문제