Multi-tenancy is an architecture in which a single instance of a software application serves multiple customers. Each customer is called a tenant.
Tenants may be given the ability to customize some parts of the application, such as the color of the user interface (UI) or business rules, but they cannot customize the application’s code.
We can implement multi-tenancy using any of the following approaches:
Database per Tenant: Each Tenant has its own database and is isolated from other tenants.
Shared Database, Shared Schema: All Tenants share a database and tables.
Every table has a Column with the Tenant Identifier, that shows the owner of the row.
Shared Database, Separate Schema: All Tenants share a database, but have their own database schemas and tables.
A JDBC connection pool is a group of reusable connections for a particular database.
Because creating each new physical connection is time consuming, the server maintains a pool of available connections to increase performance.
When an application requests a connection, it obtains one from the pool. When an application closes a connection, the connection is returned to the pool.
When creating a connection pool , you are actually defining the aspects of a connection to a specific database. Before creating the pool, you must first install and integrate the JDBC driver.
The properties of connection pools can vary with different database vendors.
Some common properties are the database’s name (URL), user name, and password.
Certain data specific to the JDBC driver and the database vendor must be entered. Before proceeding, gather the following information:
Database vendor name
Resource type, such as javax.sql.DataSource (local transactions only) javax.sql.XADataSource (global transactions)
Data source class name: If the JDBC driver has a Datasource class for the resource type and database, then the value of the Datasource Classname field is required.
Required properties, such as the database name (URL), user name, and password
A JDBC connection pool is a group of reusable connections for a particular database. When creating the pool with the Administration Console, the Administrator is actually defining the aspects of a connection to a specific database.
Before creating the pool, you must first install and integrate the JDBC driver. When building the Create Connection Pool pages, certain data specific to the JDBC driver and the database vendor must be entered.
Before proceeding, gather the following information:
Database vendor name
Resource type, such as javax.sql.DataSource (local transactions only) javax.sql.XADataSource (global transactions)
Data source class name
Required properties, such as the database name (URL), user name, and password
Connection Pool Libraries considered for analysis:
1) Apache Commons DBCP2:
Easy to configure. Very detailed configuration page.
Supports prepared statement caching
Does not validate connections on borrow
Does not reset transaction isolation when returns to the pool
Does not reset the read-only status of the connection
Does not reset the auto-commit status of the connection
Does not clear SQL warnings
DBCP2 compiles and runs under Java 7 only (JDBC 4.1), not sure if it runs on Java 8
More than 60 classes in the library
Does not validate connections on borrow
The code is hosted on GitHub https://github.com/apache/commons-dbcp. The repository has 21 contributors and only 2 contributions in the year 2017. A lot of broken links on the home page, java doc links are broken.
I logged into Apache Bugtracker (JIRA) to check for the number of bugs, there are 11 open and reopened bugs.
Licensed under Apache 2.0
2)C3P0:
C3P0 is one of the oldest and best-known libraries. It is very well documented. However, according to some reports, it’s easy to misconfigure the pool and can result in poor performance and deadlocks.
It comes in a package with hibernate.
Works well in the heavy concurrent environment.
Supports prepared statement pooling
Resets auto commit status when returning to the pool
Resets read the only status when returning to the pool
Resets isolation level when returning to the pool
Does not test connections at getConnection()
Around 200 classes in the library. Huge code base compared to others.
The code is hosted on Github -> Repository, the library has 5 contributors with 5 contributions to the code this year, 4th May had the last check-in.
Issues are tracked on Github tracker and have 41 issues listed.
The library is licensed under LGPL v.2.1 and EPL v.1.0
3)Tomcat JDBC:
Supports highly concurrent environments and multi-core/CPU systems.
It is very well documented here.
Async connection retrieval. Can queue connection requests and return Future back.
Ability to configure custom interceptors to enhance functionality.
It provides multiple ways to configure the pool. One is inside the Apache container, JMX and standalone by using DataSource bean.
It does not by default reset auto-commit and transaction levels for connections in the pool, users must configure custom interceptors to do this.
Does not by default test connections on getConnection()
It does not close abandoned open statements.
Pool prepared statement properties are not used.
The code is hosted on GitHub. It has 13 active contributors.
This is a very active community, one can see looking at the commits and bug list.
licensed under Apache 2.0
4) HikariCP:
Very light library, around 130 kb.
Tests connections at getConnection()
Tracks and closes abandoned connections.
Clears connections before returning the connection to the client.
Resets auto-commit, transaction isolation, read-only status
The library has 58 active contributors and has a very detailed configuration page with performance benchmarks.
Quartz is a job scheduling library that can be integrated into a wide variety of Java applications.
Quartz is generally used for enterprise class applications to support process workflow, system management actions and to provide timely services within the applications.
You can create complex schedules for executing any job. Examples are e.g. tasks that run daily, every other Monday 8:30 p.m. or only on the last day of every month.
You can download Quartz from http://quartz-scheduler.org/downloads
Components:
============
Quartz job:
Quartz job is used for the logic or code which you want to execute. It implements org.quartz.Job interface.
Quartz trigger:
Quartz trigger is used to define the moment when the quartz scheduler will execute quartz’s job.
Types of quartz trigger:
1. SimpleTrigger – SimpleTrigger setting start time, end time, repeat count and repeat interval for quartz’s job.
2.CronTrigger – CronTrigger uses cron expressions to specify the moment when to execute quartz’s job.
A cron expression is made up of seven sub expressions:
Seconds
Minutes
Hours
Day-of-Month
Month
Day-of-Week
Year (optional field)
3. Scheduler class – Scheduler class is used to connect the quartz job and quartz trigger together and execute the job.
4.JobListener:
JobListener provides the facility to track the status of running jobs. To write a JobListener we have to implements the JobListener interface.
Quartz API:
===========
The key interfaces of the API are:
Scheduler – the primary API for interacting with the scheduler of the framework
Job – an interface to be implemented by components that we wish to have executed
JobDetail – used to define instances of Jobs
Trigger – a component that determines the schedule upon which a given Job will be performed
JobBuilder – used to build JobDetail instances, which define instances of Jobs
A Spring Boot project that contains nested maven projects is called the multi-module project.
In the multi-module project, the parent project works as a container for base maven configurations.A multi-module project is defined by a parent POM referencing one or more submodules.
The parent maven project must contain the packaging type pom that makes the project as an aggregator.
The pom.xml file of the parent project consists the list of all modules, common dependencies, and properties that are inherited by the child projects. The parent pom is located in the project's root directory. The child modules are actual Spring Boot projects that inherit the maven properties from the parent project.
Benefits of Using Multi-Modules:
The significant advantage of using this approach is that we may reduce duplication.
Let's say we have an application which consists of several modules, let it be a front-end module and a back-end module.
Now, we work on both of them and change functionality which affects the two. In that case, without a specialized build tool, we'll have to build both components separately or write a script which would compile the code, run tests and show the results.
Then, after we get even more modules in the project, it will become harder to manage and maintain.
Besides, in the real world, projects may need certain Maven plugins to perform various operations during build lifecycle, share dependencies and profiles or include other BOM projects.
Therefore, when leveraging multi-modules, we can build our application's modules in a single command and if the order matters, Maven will figure this out for us. Also, we can share a vast amount of configuration with other modules.
Parent POM:
Maven supports inheritance in a way that each pom.xml file has the implicit parent POM, it's called Super POM and can be located in the Maven binaries.
These two files are merged by Maven and form the Effective POM.
Spring Boot is an open-source micro framework maintained by a company called Pivotal.
It provides Java developers with a platform to get started with an auto configurable production-grade Spring application. With it, developers can get started quickly without losing time on preparing and configuring their Spring application.
Spring Boot is built on top of the Spring framework, and it comes with many dependencies that can be plugged into the Spring application.
Some examples are Spring Kafka, Spring LDAP, Spring Web Services, and Spring Security. However, developers have to configure each building brick themselves using a lot of XML configuration files or annotations.
In Spring Boot, there is no requirement for XML configuration (deployment descriptor). It uses convention over configuration software design paradigm that means it decreases the effort of the developer.
Features:
Create stand-alone Spring applications
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
Provide opinionated 'starter' dependencies to simplify your build configuration
Automatically configure Spring and 3rd party libraries whenever possible
Provide production-ready features such as metrics, health checks, and externalized configuration
Absolutely no code generation and no requirement for XML configuration