*************************************
Tajo JDBC Driver
*************************************

Apache Tajo™ provides JDBC driver
which enables Java applciations to easily access Apache Tajo in a RDBMS-like manner.
In this section, we explain how to get JDBC driver and an example code.

How to get JDBC driver
=======================

Direct Download
--------------------------------

You can directly download a JDBC driver jar file (``tajo-jdbc-x.y.z.jar``) from `Downloads <http://tajo.apache.org/downloads.html>`_.

From Binary Distribution
--------------------------------

Tajo binary distribution provides JDBC jar file located in ``${TAJO_HOME}/share/jdbc-dist/tajo-jdbc-x.y.z.jar``.


From Building Source Code
--------------------------------

You can build Tajo from the source code and then get JAR files as follows:

.. code-block:: bash

  $ tar xzvf tajo-x.y.z-src.tar.gz
  $ mvn clean package -DskipTests -Pdist -Dtar
  $ ls -l tajo-dist/target/tajo-x.y.z/share/jdbc-dist/tajo-jdbc-x.y.z.jar


Setting the CLASSPATH
=======================

In order to use the JDBC driver, you should add ``tajo-jdbc-x.y.z.jar`` in your ``CLASSPATH``.

.. code-block:: bash

  CLASSPATH=path/to/tajo-jdbc-x.y.z.jar:$CLASSPATH


Connecting to the Tajo cluster instance
=======================================
A Tajo cluster is represented by a URL. Tajo JDBC driver can take the following URL forms:

 * ``jdbc:tajo://host/``
 * ``jdbc:tajo://host/database``
 * ``jdbc:tajo://host:port/``
 * ``jdbc:tajo://host:port/database``

Each part of URL has the following meanings:

 * ``host`` - The hostname of the TajoMaster. You can put hostname or ip address here.
 * ``port`` - The port number that server is listening. Default port number is 26002.
 * ``database`` - The database name. The default database name is ``default``.

 To connect, you need to get ``Connection`` instance from Java JDBC Driver Manager as follows:

.. code-block:: java

  Connection db = DriverManager.getConnection(url);


Connection Parameters
=====================
Connection parameters lets the JDBC Copnnection to enable or disable additional features. You should use ``java.util.Properties`` to pass your connection parameters into ``Connection``. The following example means that the transmission of ResultSet uses compression and its connection timeout is 15 seconds. 

.. code-block:: java

  String url = "jdbc:tajo://localhost/test";
  Properties props = new Properties();
  props.setProperty("useCompression","true");  // use compression for ResultSet
  props.setProperty("connectTimeout","15000"); // 15 seconds
  Connection conn = DriverManager.getConnection(url, props);

The connection parameters that Tajo currently supports are as follows:

 * ``useCompression = bool`` - Enable compressed transfer for ResultSet.
 * ``defaultRowFetchSize = int`` - Determine the number of rows fetched in ResultSet by one fetch with trip to the Server.
 * ``connectTimeout = int (seconds)`` - The timeout value used for socket connect operations. If connecting to the server takes longer than this value, the connection is broken. The timeout is specified in seconds and a value of zero means that it is disabled.
 * ``socketTimeout = int (seconds)`` - The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems. The timeout is specified in seconds and a value of zero means that it is disabled.
 * ``retry = int`` - Number of retry operation. Tajo JDBC driver is resilient against some network or connection problems. It determines how many times the connection will retry.


An Example JDBC Client
=======================

The JDBC driver class name is ``org.apache.tajo.jdbc.TajoDriver``.
You can get the driver ``Class.forName("org.apache.tajo.jdbc.TajoDriver")``.
The connection url should be ``jdbc:tajo://<TajoMaster hostname>:<TajoMaster client rpc port>/<database name>``.
The default TajoMaster client rpc port is ``26002``.
If you want to change the listening port, please refer :doc:`/configuration/cluster_setup`.

.. note::
  
  Currently, Tajo does not support the concept of database and namespace. 
  All tables are contained in ``default`` database. So, you don't need to specify any database name.

The following shows an example of JDBC Client.

.. code-block:: java

  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.Statement;
  import java.sql.DriverManager;

  public class TajoJDBCClient {
    
    ....

    public static void main(String[] args) throws Exception {

      try {
        Class.forName("org.apache.tajo.jdbc.TajoDriver");
      } catch (ClassNotFoundException e) {
        // fill your handling code
      }

      Connection conn = DriverManager.getConnection("jdbc:tajo://127.0.0.1:26002/default");

      Statement stmt = null;
      ResultSet rs = null;
      try {
        stmt = conn.createStatement();
        rs = stmt.executeQuery("select * from table1");
        while (rs.next()) {
          System.out.println(rs.getString(1) + "," + rs.getString(3));
        }
      } finally {
        if (rs != null) rs.close();
        if (stmt != null) stmt.close();
        if (conn != null) conn.close();
      }
    }
  }

