Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


JIRA
Discussion thread-https://lists.apache.org/thread/d1owrg8zh77v0xygcpb93fxt0jpjdkb3
Vote threadhttps://lists.apache.org/thread/7jbmg22lnww31sbfdzztwrzgm6bkhjrj
JIRA

Jira
serverASF JIRA
serverId5aa69414-a9e9-3523-82ec-879b028fb15b

keyFLINK-31496

Release-1.18.0


Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).

...

draw.io Board Diagram
bordertrue
diagramNamedriver-gateway
simpleViewerfalse
width
linksauto
tbstyletop
lboxtrue
diagramWidth281
revision1

There are 6 7 main classes in Flink Jdbc Driver: FlinkDriver, FlinkDataSource, FlinkConnection, FlinkStatement, FlinkResultSet, FlinkDatabaseMetaData and FlinkResultSetMetaData which implement jdbc interface Driver, DataSource, Connection, Statement, ResultSet, DatabaseMetaData and ResultSetMetaData.

  1. FlinkDriver parses gateway address from url, and creates FlinkConnection
  2. FlinkDataSource manages connection pool for flink jdbc, it will create specific count of connections and choose one for client directly.
  3. FlinkConnection FlinkConnection creates Executor according to gateway address. When the Connections is closed, it can close the connection with gateway by Executor
  4. FlinkStatement can get Executor from FlinkConnection, and submit sql query to it. After query is executed, FlinkStatement can get StatementResult from Executor, and create FlinkResultSet
  5. FlinkResultSet is an iterator, it gets results from StatementResult and return them to users
  6. FlinkDatabaseMetaData provides meta data of catalogs, databases and tables
  7. FlinkResultSetMetaData provides meta data of ResultSet such as columns

...

draw.io Board Diagram
bordertrue
diagramNameclasses-driver
simpleViewerfalse
width
linksauto
tbstyletop
lboxtrue
diagramWidth701
revision23

There're Sessions and Operations in SqlGateway. SqlGateway will open a Session for each external connection FlinkConnection , and then do multiple Operations in one Session. When users create a FlinkSession by FlinkConnection by FlinkDriver with SqlGateway, it will open an exist or a new Session. Any time users want to issue SQL statements to the database, they require a FlinkStatement instance from FlinkConnection. Once users have a FlinkStatement , they can use issue a query. This will return a FlinkResultSet instance, which contains the entire result. Each operation such as the execution query(Flink job), fetching results in FlinkResultSet will be an Operation in the Session of SqlGateway .

...

Currently TIMESTAMP_WITH_LOCAL_TIMEZONE is not exist in java.sql.Types, but it is supported by Flink. Users can define a field as (f TIMESTAMP(p) WITH LOCAL TIME ZONE) and set time zone through the connection parameters or dynamic parameters in console by table.local-time-zone. After that, users can get Timestamp which will be automatically converted from stored time data into specific Timestamp  according to the given time zone.

...

Java Sql Interfaces

There are many methods in Jdbc Driver, while this FLIP only implement the basic methods first and more methods will be implemented later when they are needed. 

...

Code Block
languagejava
/* Jdbc Driver for flink sql gateway. */
public class FlinkDriver implements Driver {
    /* Connect Only Batch Mode queries are supported. If you force to submit streaming queries, you may get unrecognized updates, deletions and other results in FlinkResultSet. */
public class FlinkDriver implements Driver {
    /* Connect sql gateway with given url and open/create session with given priperties. */
	@Override
    public Connection connect(String url, Properties info) throws SQLException;
}
  • Methods in FlinkConnection FlinkDataSource
Code Block
languagejava
/* ConnectionJdbc toDataSource flinkmanages sql gatewayconnections for jdbc driverclient, we can support more operations in it in the future. */
public class FlinkConnectionFlinkDataSource implements ConnectionDataSource {
	/* The max  /* Create statement from connectioncount of connections which the data source holds. */
	@Override
    public Statement createStatement() throws SQLException;
    
    /* Close session in sql gatewayprivate int maxActive;

	/* Set the url of connection. */
	public synchronized void setUrl(String url);

	/* Set the driver class name for the source. */
 	@Override
    publicpublic synchronized void closesetDriverClassName(String driverClassName) throws; SQLException;
    
    
	/* UseSet giventhe catalogmax toactive theconnection sessionfor inthe sql gatewaysource. */
 	@Override 
    public synchronized void setCatalogsetMaxActive(Stringint catalogmaxActive) throws SQLException;
    
    /* Get currenta catalogconnection namefrom fromdata sessionsource. */
 	@Override 
    public StringConnection getCataloggetConnection() throws SQLException;
   	@Override 
    public Connection getConnection(String username, String password) throws SQLException;
}
  • Methods in FlinkConnection 
Code Block
languagejava
/* Connection to flink sql gateway for jdbc driver. */
public class FlinkConnection implements Connection {
    /* Create statement from connection. */
	@Override
    public Statement createStatement() throws SQLException;
    
    /* Close session in sql gateway. */
 	@Override
    public void close() throws SQLException;
    
    /* Use given catalog to the session in sql gateway. */
 	@Override 
    public void setCatalog(String catalog) throws SQLException;
    
    /* Get current catalog name from session. */
 	@Override 
    public String getCatalog() throws SQLException;
    
    /* Get FlinkDatabaseMetaData instance for the current catalog. */
 	@Override 
    public DatabaseMetaData getMetaData() throws SQLException;
    
    /* Use given database to the session in sql gateway. */
 	@Override 
    public void setSchema(String schema) throws SQLException;
    
    /* Get current database name from session. */
 	@Override 
    public String getSchema() throws SQLException;
}

...

  • Methods in FlinkResultSet : FlinkResultSet only supports fetching data from iterator StatementResult , it supports getXXX methods and doesn't support deleting, updating or moving the cursor. Compare with ResultSet , there is getKind method in FlinkResultSet to get the RowKind of current record.
Code Block
languagejava
/* ResultSet for flink jdbc driver. */
public class FlinkResultSet implements ResultSet {
	/* Get the row kind for the current record ResultSet for flink jdbc driver. Only Batch Mode queries are supported. If you force to submit streaming queries, you may get unrecognized updates, deletions and other results. */
	public RowKind getKind();
 class FlinkResultSet implements ResultSet {
    /* Return true if there are more resuts in result iterator. */
 	@Override 
    public boolean next() throws SQLException;
    
    /* Close the fetch result operation. */
 	@Override 
    public void close() throws SQLException;
    
    /* Get different values according to data type and column index. */
 	@Override 
    public <V> V getXXX(int columnIndex) throws SQLException.
    
    /* Get different values according to data type and column name. */
 	@Override
    public <V> V getXXX(String columnName) throws SQLException.
}

...

When an error occurs, Flink Jdbc Driver mainly throws the following exceptions

SQLState ClassSQLState SubClassReasonExceptionOperations
22000 to 02H according to different errorsDescription of data conversion errorSQLDataExceptionGet data error from ResultSet in methods getXXX
0A000Specific feature is not supportedSQLFeatureNotSupportedExceptionAll unimplemented methods will throw this exception
58004The exception or error message from GatewaySQLNonTransientExceptionGateway throws an exception or returns an error message when executing the query
08006The session is not exist in Gateway and client need to create new connection to itSQLNonTransientConnectionExceptionGateway is restarted and the client need to create new connection

We can continue to subdivide and throw different exceptions according to the error information returned by the Gateway in Flink Jdbc Driver in the future

...