// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
= Java Client

Ignite 3 clients connect to the cluster via a standard socket connection. Unlike Ignite 2.x, there is no separate Thin and Thick clients in Ignite 3. All clients are 'thin'.

Clients do not become a part of the cluster topology, never hold any data, and are not used as a destination for compute calculations.

== Getting Started
=== Prerequisites

To use Java thin client, Java 11 or newer is required.

=== Installation

Java client can be added to your project by using maven:

[source, xml]
----
<dependency>
    <groupId>org.apache.ignite</groupId>
    <artifactId>ignite-client</artifactId>
    <version>3.0.0-beta2</version>
</dependency>
----

== Connecting to Cluster

To initialize a client, use the `IgniteClient` class, and provide it with the configuration:

[tabs]
--
tab:Java[]
[source, java]
----
try (IgniteClient client = IgniteClient.builder()
  .addresses("127.0.0.1:10800")
  .build()
) {
  // Your code goes here
}
----
--

== Authentication

To pass authentication information, use the `IgniteClientAuthenticator` class and pass it to `IgniteClient` builder:
[tabs]
--
tab:Java[]
[source, java]
----
IgniteClientAuthenticator auth = BasicAuthenticator.builder().username("myUser").password("myPassword").build()
IgniteClient.builder()
            .addresses("127.0.0.1:" + server.port())
            .authenticator(authenticator)
            .build();
----
--

=== Limitations

There are limitations to user types that can be used for such a mapping. Some limitations are common, and others are platform-specific due to the programming language used.

- Only flat field structure is supported, meaning no nesting user objects. This is because Ignite tables, and therefore tuples have flat structure themselves;
- Fields should be mapped to Ignite types;
- All fields in user type should either be mapped to Table column or explicitly excluded;
- All columns from Table should be mapped to some field in the user type;
- *Java only*: Users should implement Mapper classes for user types for more flexibility;

=== SQL Scripts

The default API executes SQL statements one at a time. If you want to execute large SQL statements, pass them to the `executeScript()` method. These statements will be executed in order.

[tabs]
--
tab:Java[]
[source, java]
----
String script = ""
                + "CREATE TABLE IF NOT EXISTS Person (id int primary key, city_id int, name varchar, age int, company varchar);"
                + "INSERT INTO Person (1,3, John, 43, Sample)";

ignite.sql().executeScript(script);
----
--

NOTE: Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script.


== Client Metrics

=== Java

When running Java client, you need to enable metrics in the client builder:

[source, java]
----
IgniteClient client = IgniteClient.builder()
  .addresses("127.0.0.1:10800")
  .metricsEnabled(true)
  .build()

----

After that, client metrics will be available to any Java monitoring tool, for example link:https://www.oracle.com/java/technologies/jdk-mission-control.html[JDK Mission Control].

==== Available Java Metrics

[width="100%",cols="20%,80%",opts="header"]
|=======================================================================
|Metric name | Description

|ConnectionsActive|The number of currently active connections.
|ConnectionsEstablished|The number of established connections.
|ConnectionsLost|The number of connections lost.
|ConnectionsLostTimeout|The number of connections lost due to a timeout.
|HandshakesFailed|The number of failed handshakes.
|HandshakesFailedTimeout|The number of handshakes that failed due to a timeout.
|RequestsActive|The number of currently active requests.
|RequestsSent|The number of requests sent.
|RequestsCompleted|The number of completed requests. Requests are completed once a response is received.
|RequestsRetried|The number of request retries.
|RequestsFailed|The number of failed requests.
|BytesSent|The amount of bytes sent.
|BytesReceived|The amount of bytes received.
|StreamerBatchesSent|The number of data streamer batches sent.
|StreamerItemsSent|The number of data streamer items sent.
|StreamerBatchesActive|The number of existing data streamer batches.
|StreamerItemsQueued|The number of queued data streamer items.

|=======================================================================