반응형
mariadb JDBC 드라이버를 사용하여 로그인하면 SQLNonTransientConnection이 생성됩니다.예외.
저는 인터넷 + openvpn을 통해 원격 mariadb 데이터베이스에 액세스하기 위해 javafx 데스크톱 앱을 실행하고 있습니다.mysql 명령줄 인터페이스를 통해 정상적으로 로그인할 수 있지만 로그인할 때 Java 앱이 시간 초과됩니다.반복적으로 재시도하면 로그인이 정상적으로 되고 이후에는 응용 프로그램이 정상적으로 작동합니다.따라서 제한 시간은 로그인 시에만 적용됩니다.mariadb JDBC 타임아웃에 대해 이야기하는 많은 스택 오버플로 게시물을 볼 수 있지만 로그인에 특정한 것은 없습니다.
다음은 문제를 보여주는 테스트 프로그램입니다(중요 문자열을 변경하여 주석을 달았습니다).
public void login()
{
Connection connection = null;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy SSS");
boolean connected = false;
int attempt = 0;
String url = "jdbc:mariadb://hostxxx:3306/databasexxx";
while (!connected)
{
try
{
attempt++;
System.out.println("connecting: attempt " + attempt + " at "
+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")));
connection = DriverManager.getConnection(url, "userxxx", "passwordxxx");
connected = true;
System.out.println("connected");
return;
}
catch (SQLException ex)
{
System.out.println(ex.getClass().getSimpleName() + ": " + ex.getMessage());
}
}
}
다음은 출력입니다.
started
connecting: attempt 1 at 2022-09-16 14:46:01.352
SQLNonTransientConnectionException: Could not connect to address=(host=hostxxx)(port=3306)(type=master) : Read timed out
connecting: attempt 2 at 2022-09-16 14:46:03.658
SQLNonTransientConnectionException: Could not connect to address=(host=hostxxx)(port=3306)(type=master) : Read timed out
connecting: attempt 3 at 2022-09-16 14:46:05.524
SQLNonTransientConnectionException: Could not connect to address=(host=hostxxx)(port=3306)(type=master) : Read timed out
...
connecting: attempt 19 at 2022-09-16 14:46:36.735
SQLNonTransientConnectionException: Could not connect to address=(host=hostxxx)(port=3306)(type=master) : Read timed out
connecting: attempt 20 at 2022-09-16 14:46:38.633
connected
이 경우 20번의 시도 후 로그인할 수 있습니다.2초 정도 지나면 타임아웃이 되는 것 같습니다.로컬 데이터베이스에 대해 프로그램을 실행하면 잘 작동합니다.Mariadb jdbc 드라이버 버전 2.7.2와 2.7.6을 사용해 보았습니다.URL에 ?socketTimeout=30000과 ?connectTimeout=30000"을 추가하려고 했지만 아무런 차이가 없었습니다.
다음은 전체 스택 추적입니다.
java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=hostxxx)(port=3306)(type=master) : Read timed out
at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:197)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1394)
at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:635)
at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:150)
at org.mariadb.jdbc.Driver.connect(Driver.java:89)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at mariadblogin.Login.login(Login.java:29)
at mariadblogin.Main.main(Main.java:17)
Caused by: java.sql.SQLNonTransientConnectionException: Read timed out
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.handleIoException(AbstractQueryProtocol.java:2091)
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1541)
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1520)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.readPipelineAdditionalData(AbstractConnectProtocol.java:1033)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.postConnectionQueries(AbstractConnectProtocol.java:885)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:600)
at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1389)
... 7 more
Caused by: java.net.SocketTimeoutException: Read timed out
at java.base/java.net.SocketInputStream.socketRead0(Native Method)
at java.base/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133)
at org.mariadb.jdbc.internal.io.input.ReadAheadBufferedStream.fillBuffer(ReadAheadBufferedStream.java:131)
at org.mariadb.jdbc.internal.io.input.ReadAheadBufferedStream.read(ReadAheadBufferedStream.java:104)
at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacketArray(StandardPacketInputStream.java:247)
at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacket(StandardPacketInputStream.java:218)
at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1539)
... 12 more
저는 이 문제를 어떻게 해결할 것인지에 대한 누구의 의견에도 매우 감사할 것입니다.
언급URL : https://stackoverflow.com/questions/73746161/login-with-mariadb-jdbc-driver-generates-sqlnontransientconnectionexception
반응형
'programing' 카테고리의 다른 글
jQuery: $().click(fn) 대 $().bind('click',fn); (0) | 2023.08.24 |
---|---|
git branch -d는 경고를 줍니다. (0) | 2023.08.19 |
두 개의 나란히 있는 div 요소를 동일한 높이로 유지하려면 어떻게 해야 합니까? (0) | 2023.08.19 |
도메인 없이 사용자 이름을 가져오는 방법 (0) | 2023.08.19 |
xml 파일에서 보기를 부풀린다는 것은 무엇을 의미합니까? (0) | 2023.08.19 |