Ошибка выполнения запроса в коде Java для подключения к Presto

Мы пытаемся подключиться к Presto с помощью кода Java и выполнить несколько запросов. Каталог, который мы используем, - это MySQL.

  • Presto установлен на сервере Linux. Presto CLI отлично работает в Linux. Запустил Presto в Linux.
  • MySQL также установлен на машине Linux. Мы можем получить доступ к MySQL в Windows с помощью DbVisualizer.
  • Я создал каталог коннекторов MySQL для Presto. Мне удалось запросить данные MySQL с помощью Presto CLI как presto --server localhost:8080 --catalog mysql --schema tutorials.

Выполняя код Java на машине Windows, я могу получить доступ к MySQL и выполнять запросы, но мы не можем запрашивать данные. Когда мы пытаемся запустить запрос из Presto, он выдает ошибку при выполнении запроса. В приведенном ниже примере я использовал банку от Trinosql.

      package testdbPresto;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class PrestoJdbc {

  public static void main(String args[]) throws SQLException, ClassNotFoundException {
      
      try{ 
      //connect mysql server tutorials database here 
      Class.forName("com.facebook.presto.jdbc.PrestoDriver");  
      String url = "jdbc:trino://35.173.241.37:8080/mysql/tutorials";
      Properties properties = new Properties();
      properties.setProperty("user", "root");
      properties.setProperty("password", "Redcar88!");
      properties.setProperty("SSL", "true");
      Connection connection = DriverManager.getConnection(url, properties);

      Statement statement = null;  
      statement = connection.createStatement();
      //select mysql table author table two columns  
      String sql;  
      sql = "select auth_id, auth_name from mysql.tutorials.author"; 
     
      ResultSet resultSet = statement.executeQuery(sql);  

      //Extract data from result set
      while (resultSet.next()) {
        //Retrieve by column name
        String name = resultSet.getString("auth_name");
        //Display values
        System.out.println("name : " + name);
      }
      //Clean-up environment
      resultSet.close();
      statement.close();
      connection.close();
      }catch(Exception e){ e.printStackTrace();}  
    
    }
  }

Выход:

          java.sql.SQLException: Error executing query
        at io.trino.jdbc.TrinoStatement.internalExecute(TrinoStatement.java:274)
        at io.trino.jdbc.TrinoStatement.execute(TrinoStatement.java:227)
        at io.trino.jdbc.TrinoStatement.executeQuery(TrinoStatement.java:76)
        at testdbPresto.PrestoJdbc.main(PrestoJdbc.java:29)
    Caused by: java.io.UncheckedIOException: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
        at io.trino.jdbc.$internal.client.JsonResponse.execute(JsonResponse.java:154)
        at io.trino.jdbc.$internal.client.StatementClientV1.<init>(StatementClientV1.java:110)
        at io.trino.jdbc.$internal.client.StatementClientFactory.newStatementClient(StatementClientFactory.java:24)
        at io.trino.jdbc.QueryExecutor.startQuery(QueryExecutor.java:46)
        at io.trino.jdbc.TrinoConnection.startQuery(TrinoConnection.java:728)
        at io.trino.jdbc.TrinoStatement.internalExecute(TrinoStatement.java:239)
        ... 3 more
    Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
        at sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:448)
        at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:174)
        at sun.security.ssl.SSLTransport.decode(SSLTransport.java:110)
        at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1279)
        at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1188)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:401)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:299)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:268)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.RealConnection.connect(RealConnection.java:160)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:256)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:134)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:113)
        at io.trino.jdbc.$internal.okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at io.trino.jdbc.$internal.okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at io.trino.jdbc.$internal.okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at io.trino.jdbc.$internal.client.OkHttpUtil.lambda$basicAuth$1(OkHttpUtil.java:85)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at io.trino.jdbc.$internal.client.OkHttpUtil.lambda$userAgent$0(OkHttpUtil.java:71)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at io.trino.jdbc.$internal.okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at io.trino.jdbc.$internal.okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
        at io.trino.jdbc.$internal.okhttp3.RealCall.execute(RealCall.java:77)
        at io.trino.jdbc.$internal.client.JsonResponse.execute(JsonResponse.java:131)
        ... 8 more

2 ответа

Вот код, который работает с Trino.

      fun main() {
    val trinoUrl = "jdbc:trino://myDomain:443"
    val properties = Properties()
    properties.setProperty("user", "noUserS")
//    properties.setProperty("password", "noPass")
    properties.setProperty("SSL", "true")

    DriverManager.getConnection(trinoUrl, properties).use { trinoConn ->
        trinoConn.createStatement().use { statement ->
            statement.connection.catalog = "catalog1"
            statement.connection.schema = "default"

            println("Executing query...")

            statement.executeQuery("""
                    select 
                      restaurantId, 
                      type,
                      time 
                    from table1 
                    where time > CURRENT_TIMESTAMP - INTERVAL '1' hour
                """.trimIndent()
            ).use { resultSet ->
                val list = mutableListOf<Map<String, String>>()

                while (resultSet.next()) {
                    val data = mapOf(
                        "restaurantId" to resultSet.getString("restaurantId"),
                        "type" to resultSet.getString("type"),
                        "time" to resultSet.getString("time")
                    )
                    list.add(data)
                }

                println("Records returned: ${list.size}")
                println(list)
            }
        }
    }
    exitProcess(0)
}


Это Котлин, но его легко понять. .use {..}егоtry-with-resourcesв Яве.

Надеюсь это поможет.

Это довольно старый вопрос, но он может быть все еще актуален. Вы пытаетесь подключиться к трино с драйвером presto jdbc. PrestoSQL был переименован в Trino. Таким образом, чтобы получить доступ к trino через jdb, вы должны использовать драйвер jdbc trino.

Добавьте зависимость trino в свой путь к классам. Если вы используете maven, добавьте эту зависимость в файл pom.

      <dependency>
   <groupId>io.trino</groupId>
   <artifactId>trino-jdbc</artifactId>
   <version>${trino-jdbc.version}</version>
</dependency>

Затем используйте следующий драйвер

      Class.forName("io.trino.jdbc.TrinoDriver");
Другие вопросы по тегам