programing

mariadb JDBC 드라이버를 사용하여 로그인하면 SQLNonTransientConnection이 생성됩니다.예외.

batch 2023. 8. 19. 09:59
반응형

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

반응형