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

import org.mariadb.jdbc.MariaDbPoolDataSource;
import org.mariadb.jdbc.internal.util.pool.Pool;


public class MariaDbPoolDataSourceTest {
	public static void main(String[] args) throws SQLException, InterruptedException {
		final String jdbcUrl = "jdbc:mariadb://localhost:3306/global?maxPoolSize=1";

		try (MariaDbPoolDataSource pool = new MariaDbPoolDataSource(jdbcUrl)) {
			pool.setUser("user");
			pool.setPassword("password");
			System.out.println("New: " + printConnection(pool));

			try {
				try (Connection connect = pool.getConnection()) {
					System.out.println("Init: " + printConnection(pool));
					System.out.println("Stop the database server");
					Thread.sleep(10000);

					try (Statement statement = connect.createStatement();
					     ResultSet res = statement.executeQuery("SELECT 1")) {
						while (res.next()) {
							System.out.println(res.getString(1));
						}
					}
				}
			} catch (final Exception e) {
				e.printStackTrace();
				Thread.sleep(1000);
			} finally {
				System.out.println("End: " + printConnection(pool));	// Connection is closed but Active = 1
			}
			
			try (Connection connect = pool.getConnection()) {
				// pool full -> timeout
			}
		}
	}

	private static String printConnection(MariaDbPoolDataSource pool) {
		final Pool mariaDBPool = pool.testGetPool();
		if (mariaDBPool == null) {
			return "Empty Pool";
		}

		return "Total: " + mariaDBPool.getTotalConnections() + " Active: " + mariaDBPool.getActiveConnections() + " Idle: " + mariaDBPool.getIdleConnections();
	}
}
