bi, integration, and apps on couchbase using simba odbc and jdbc

40
Open Connectivity BI, Integration, and Apps on Couchbase using ODBC and JDBC June, 2015

Upload: simba-technologies

Post on 16-Jan-2017

106 views

Category:

Software


0 download

TRANSCRIPT

Page 1: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Open ConnectivityBI, Integration, and Apps on Couchbase using ODBC

and JDBCJune, 2015

Page 2: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Who I am• Driver(s) Overview• Relational Model• Demos• ODBC in-depth• JDBC in-depth• QA

Contents

Page 3: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Worked in the data access space for eight years and counting• ODBC, OLEDB, JDBC, ADO.NET, ODBO, XMLA

• Core developer for the current generation of Simba’s data access technologies

• Collaborated at an Engineering Level with Simba ISV Customers to design and implement data drivers that are today being shipped world wide

Kyle at a glance

Page 4: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Simba connects people to data.• HQ’ed in Vancouver, BC.• 100ish employees.• Founded in 1991.• In 1992, Simba co-authored the original ODBC standard with Microsoft.• Simba produces the SimbaEngine® SDK and drivers for the leading

data sources on multiple platforms.

Simba Technologies at a glance

Page 5: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Simba Technologies at a glance

Page 6: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC
Page 7: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Partnership to create read/write ODBC and JDBC drivers• ODBC 3.80• JDBC 4.0 and 4.1

• Allow easy access to data within Couchbase from your favourite BI and ETL tools

Why is Simba here?

Page 8: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

What is an ODBC / JDBCDriver?N1QL mode to alloweasy and advancedanalytics

Page 9: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Couchbase is NoSQL• Dynamic schema, documents vary within a bucket

• ODBC and JDBC are SQL• Expect a fixed schema, each column is one type

• Must map from dynamic schema data to fixed schema data

Schema(less)

Page 10: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• SQL• Catalog, Schema, Table

• Couchbase• Namespace, Keyspace

Schema => NamespaceTable => Keyspace (sort of)

Relational Mapping

http://www.prabathsl.com/2013/02/document-oriented-database_14.html

Page 11: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Sample JSON Document:{“Id” : 1, “Name”: “Couchbase”, “Values” : [V1,V2]}

Simple Flattening

Id Name Values[0] Values[1]

1 Couchbase V1 V2

Page 12: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Sample JSON Document:{“Id” : 1, “Name”: “Couchbase”, “Values” : [V1,V2]}

Parent

Child

Re-Normalization

Id Name1 Couchbase

Id Index Value

1 0 V1

1 1 V2

Page 13: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Demos

Page 14: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• C API• Versions: 2.x, 3.0, 3.52, 3.80, etc…• Non-Windows platforms are ODBC 3.52

• Driver Managers• Windows, iODBC, unixODBC, etc…

• All functions have return codes• SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, etc…

ODBC Technicals

Page 15: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• SQLHENV, SQLHDBC, SQLHSTMT, SQLHDESC

• Relationship is one-to-many

ODBC: Handles

Page 16: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Allocate with SQLAllocHandle, free with SQLFreeHandle• Ensure you set the version of ODBC in use

SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3_80, SQL_IS_INTEGER)

ODBC: Environment

Page 17: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Allocate with SQLAllocHandle, created from SQLHENV• Maintains the actual connection to Couchbase• Create child statement objects to do work• Disconnect with SQLDisconnect, free with SQLFreeHandle

ODBC: Connection

Page 18: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Open a connection using SQLDriverConnectSQLDriverConnect(

hDbc, windowHandle, connStr, SQL_NTS, connStrLen&outStrLen,SQL_DRIVER_COMPLETE)

Last parameter allows driver to prompt for information if connStr doesn’t contain all necessary information.

ODBC: Connection

Page 19: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Specify a Driver or DSN• Driver: Must specify all options in connection string• DSN: Can specify options in connection string

Example:“DSN=Couchbase;UID=kylep;PWD=testPassword;”

ODBC: Connection String

Page 20: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Allocate with SQLAllocHandle, created from SQLHSTMT• Used for issuing queries, retrieving catalog metadata• Free with SQLFreeHandle

ODBC: Statement

Page 21: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Use SQLExecDirect for one-off queries• Use SQLPrepare and SQLExecute for repeated queries

SQLExecDirect(hStmt, “<query>”, SQL_NTS)

orSQLPrepare(hStmt, “<query>”, SQL_NTS)SQLExecute(hStmt)

ODBC: Querying

Page 22: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• After execution, there is a cursor on the results, positioned before the first row

• Use SQLFetch to move the cursor• SQLGetData can be used to fetch cell by cell• SQLBindCol can also be used, much more efficient

ODBC: Results

Page 23: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Reuse connections so driver caches are effective

• Use SQLBindCol over SQLGetData

• Use array fetches with SQLBindCol

• Use SQLPrepare once, SQLExecute multiple times with parameters for loading data

• Use parameter arrays when binding parameters with SQLBindParameter

• Bind types to match reported parameter or column types

ODBC: Performance Tips

Page 24: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

SQLGetData vs. SQLBindCol

10 million rows, 3 columns of wide char, integer, decimal values

ODBC: Performance Tips

Method Time (s)SQLGetData 141.428SQLBindCol 6.102SQLBindCol (array[100]) 2.747

Page 25: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Is the Java version of ODBC• Versions: 3.0, 4.0, 4.1, etc…• JDBC version is tied to Java version

• Simba will supply JDBC 4.0 and 4.1 versions• There is a driver manager, but role is very limited• Errors are reported via exceptions, warnings via getWarnings()

JDBC Technicals

Page 26: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Relationship is again one-to-many

JDBC: Object Hierarchy

Page 27: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Never used directly by your code• Must be loaded by referencing using Class.forName()• FQCNs• com.simba.couchbase.jdbc4.Driver• com.simba.couchbase.jdbc41.Driver

• URL• “jdbc:couchbase://<host>:<port>/<schema>;UseN1QLMode=0/1”

JDBC: Driver

Page 28: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• ExampleString url = “jdbc:couchbase://localhost:8093/default;”Class.forName(“com.simba.couchbase.jdbc4.Driver”);Connection con = DriverManager.getConnection(url);

• With JDBC 4.0 and later, Class.forName() can be omitted

JDBC: Driver

Page 29: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Used directly by your code• FQCNs• com.simba.couchbase.jdbc4.DataSource• com.simba.couchbase.jdbc41.DataSource

• Can be used to programmatically set connection properties by using functions instead of a connection string

• Allows use of advanced features such as PooledConnection• Used less often than Driver

JDBC: DataSource

Page 30: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Can create child statement objects for queries• Can create DatabaseMetaData objects for metadata via getMetaData()

• Common pitfalls• Not closing connections; use a finally block to ensure it is closed• Not checking warnings, ever; call getWarnings() regularly• Creating a new connection for every operation; reuse connections where

possible

JDBC: Connection

Page 31: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• DatabaseMetaData• Created by Connection objects• Actually only one object per connection, cached and reused • Provides access to catalog metadata• getCatalogs(), getTables(), getColumns(), etc…

• Provides access to database metadata• getDatabaseProductVersion(), getIdentifierQuoteString(), etc…

JDBC: Database MetaData

Page 32: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Created by Connection objects• Three different types• Statement – for one-off querying• PreparedStatement – for queries with parameters• CallableStatement – for stored procedures with output

parameters*

• Statement objects will eventually dispose of themselves once out of scope, but best practice is to close() them when done

JDBC: Statement Objects

Page 33: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Cannot use parameters• Use execute(), executeQuery(), or executeUpdate() to

execute SQL or N1QL queries

JDBC: Statement

Page 34: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

execute() ExampleStatement stmt = conn.createStatement();try {

if (stmt.execute(“select * from beer-sample”)) {ResultSet rs = stmt.getResultSet();rs.close();

}}finally {

stmt.close();}

JDBC: Statement

Page 35: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• For use with parameters• Can get metadata about results before execution with getResultSetMetaData()

• Can get metadata about parameters using getParameterMetaData()

• Use set*() functions to provide parameter values

JDBC: PreparedStatement

Page 36: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• When loading data, use batches• Set all required parameters for one execution• Call addBatch() to add the current set of parameters• Call executeBatch() to execute all added batches at once

• Set parameters as reported types to avoid conversion overhead in the driver

• Reuse the statement for multiple executions

JDBC: PreparedStatement

Page 37: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

• Represents query results or catalog metadata• Describe the result set using getMetaData()• Move through result using next()• Can use isAfterLast(), isFirst(), isLast(), etc. to check cursor

position.

• Retrieve cell values using get*() methods• The driver supports all conversions between types listed by the JDBC spec• Try to retrieve as requested type to avoid conversion overhead• Remember to check wasNull() after calling get*() method

JDBC: ResultSet

Page 38: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

ResultSet ExampleResultSet rs = stmt.executeQuery(“<query>”);try { int numColumns = rs.getMetaData().getColumnCount();

while (rs.next()) { for (int i = 0; i < numColumns; ++i) { System.out.println(rs.getString(i)); }}

}finally {

rs.close();}

JDBC: ResultSet

Page 39: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

Q & A

Page 40: BI, Integration, and Apps on Couchbase using Simba ODBC and JDBC

simba.com