드라이버 관리자 getConnection에 대한 연결 시간 초과
표준 JDBC 방식을 사용하여 DB에 연결하려고 합니다.
connection = DriverManager.getConnection(url, username, password);
연결에 시간 초과 최대값이 있는지, 연결이 얼마나 오래 유지되는지, 값을 늘릴 수 있는지 등입니다.저는 연결이 영원히 열리길 원하는데, 좋은 생각인가요?
다음과 같이 드라이버 관리자의 시간 초과를 설정할 수 있습니다.
DriverManager.setLoginTimeout(10);
Connection c = DriverManager.getConnection(url, username, password);
이는 연결이 지정된 시간 내에 열리지 않으면 시간 초과됨을 의미합니다.
연결을 영원히 열어둔다는 점에서 연결을 닫지 않으면 가능하지만 좋은 생각은 아닐 수도 있습니다.연결을 완료하는 즉시 연결을 닫아야 합니다.
연결 열기 및 닫기를 최적화하려면 연결 풀을 사용할 수 있습니다.
값은 일반적으로 DB에 의해 제어됩니다.코드를 사용하여 제어할 수 없습니다.사용되는 DB 서버에 따라 다릅니다.보통 30분에서 1시간 정도입니다.
반에유, 계하는것을 것.Connection
영원히 여는 것은 매우 나쁜 생각입니다.구입 후 종료하는 것이 가장 좋습니다.Connection
,Statement
그리고.ResultSet
리소스 누출 및 시간 초과로 인한 잠재적인 애플리케이션 충돌을 방지하기 위해 가능한 한 짧은 범위 내에서 작업할 수 있습니다.
사실, DB를 연결하는 것은 비용이 많이 드는 작업입니다.응용프로그램이 비교적 오랜 시간 동안 실행되고 DB를 상당히 자주 연결해야 하는 경우 연결 풀을 사용하여 연결 성능을 향상시키는 것이 좋습니다.응용 프로그램이 웹 응용 프로그램인 경우 앱 서버의 설명서를 확인하십시오. 일반적으로 다음과 같은 형식의 연결 풀링 기능을 제공합니다.DataSource
클라이언트 애플리케이션인 경우 Apache Commons DBCP(일반적으로 사용, 로트 앱 서버에서 사용), C3P0(Hibernate에서 알려짐) 및 Proxool(XA 연결을 원하는 경우)과 같이 수년간 견고성이 입증된 타사 연결 풀링 라이브러리를 찾습니다.
연결 풀을 사용할 때는 여전히 적절한 JDBC 코드를 작성해야 합니다. 즉, 가능한 한 짧은 범위에서 모든 리소스를 획득하고 닫아야 합니다.연결 풀은 나중에 재사용하기 위해 실제로 연결을 닫거나 다시 풀로 해제하는 것에 대해 걱정하게 됩니다.
이 기사에서 JDBC 기본 사항을 올바른 방법으로 수행하는 방법에 대해 더 많은 통찰력을 얻을 수 있습니다.
이것이 도움이 되고 행복한 코딩이 되길 바랍니다.
Connector/J MYSQL 드라이버를 사용하는 방법은 다음과 같습니다.
String qqq = "jdbc:mysql://localhost/Test?connectTimeout=TIME_IN_MILLIS";
conn = DriverManager.getConnection(qqq, db_user, db_pass);
그것은 그 후에 저에게 효과가 있었습니다.setLoginTimeout()
아무것도 하지 않았습니다.
사용자 flamming_python의 보다 완전한 댓글 재게시가 저에게 효과가 있었기 때문에 답변으로 다시 게시하는 것입니다.
dbConnectionString = "jdbc:mysql://"+dbHost+":"+dbPort+"/"+dbTable+"?user="+dbUser+"&password="+dbPassword;
Properties properties = new Properties();
properties.put("connectTimeout", "2000");
dbConnect = DriverManager.getConnection(dbConnectionString, properties);
원본 댓글:
"LoL @ 스레드 - Properties 객체 prop를 만든 다음 prop.put("connectTimeout", "2000")(여기서 "2000"은 ms 단위)로 Prop 객체를 DriverManager.getConnection() 메서드에 URL과 함께 전달하면 매우 간단하게 수행할 수 있습니다."
Bestro가 제안한 바와 같이, 관련 시간 제한이 있는 미래를 사용할 수 있습니다.예:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Connection> future = executor.submit(new Callable<Connection>() {
@Override
public Connection call() throws Exception {
Connection con = DriverManager.getConnection(url, username, password);
return con;
}
});
Connection con = null;
try {
con = future.get(5, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
Logger.getLogger(Scratch.class.getName()).log(Level.SEVERE, null, ex);
}
executor.shutdownNow();
if (con == null) {
System.out.println("Could not establish connection");
} else {
System.out.println("Connection established!");
}
Java에서 ExecutorService 인터페이스를 사용할 수 있습니다.아래는 당신이 해야 할 일의 샘플입니다.
Future<Boolean> future = executor.submit(YOUR_METHOD);
future.get(TIMEOUT_YOU_NEED, TimeUnit.SECONDS);
언급URL : https://stackoverflow.com/questions/1683949/connection-timeout-for-drivermanager-getconnection
'programing' 카테고리의 다른 글
VBA를 통해 어레이 공식 삽입 (0) | 2023.06.27 |
---|---|
Python 스크립트에서 POST를 사용하여 파일 전송 (0) | 2023.06.27 |
mongodb 불가능(?)을(를) 해제할 때 E11000 중복 키 오류 dup 키 (0) | 2023.06.27 |
동적 상수 할당 (0) | 2023.06.27 |
Spring Boot Security + Thymeleaf : IProcessorDialect 클래스가 없습니다. (0) | 2023.06.27 |