c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen/*
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * CDDL HEADER START
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen *
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * The contents of this file are subject to the terms of the
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * Common Development and Distribution License (the "License").
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * You may not use this file except in compliance with the License.
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen *
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * See LICENSE.txt included in this distribution for the specific
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * language governing permissions and limitations under the License.
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen *
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * When distributing Covered Code, include this CDDL HEADER in each
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * file and include the License file at LICENSE.txt.
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * If applicable, add the following below this CDDL HEADER, with the
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * fields enclosed by brackets "[]" replaced with your own identifying
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * information: Portions Copyright [yyyy] [name of copyright owner]
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen *
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen * CDDL HEADER END
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen */
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen/*
db50fcedc48aaf1639dd7d1f0fac5f7d68f5c4c2Lubos Kosco * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen */
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlenpackage org.opensolaris.opengrok.jdbc;
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlenimport java.sql.Connection;
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlenimport java.sql.DriverManager;
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlenimport java.sql.SQLException;
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlenimport java.util.concurrent.ConcurrentLinkedQueue;
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen/**
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * Class that manages the pool of database connections.
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen */
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlenpublic class ConnectionManager {
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen /** The JDBC URL to use when creating new connections. */
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen private final String url;
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen /** A list of connections not currently in use. */
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen private final ConcurrentLinkedQueue<ConnectionResource> connections =
db50fcedc48aaf1639dd7d1f0fac5f7d68f5c4c2Lubos Kosco new ConcurrentLinkedQueue<>();
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen /**
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * Create a new {@code ConnectionManager} instance.
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen *
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen * @param driverClass the name of the JDBC driver class
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen * @param url the JDBC connection URL to the database
50203181d8c071cfd69cb197b5da0eda5c4d6372Jens Elkner * @throws ClassNotFoundException if the JDBC driver class cannot be found
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen */
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen public ConnectionManager(String driverClass, String url)
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen throws ClassNotFoundException {
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen Class.forName(driverClass);
9bc0ea09c197c784eb8b68d07d8b8559374f955fKnut Anders Hatlen this.url = url;
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen }
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen /**
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * Open a new connection to the database.
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen *
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * @return a {@code Connection} object
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * @throws SQLException if a database error occurs
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen */
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen Connection openConnection() throws SQLException {
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen return DriverManager.getConnection(url);
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen }
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen /**
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * Get a {@code ConnectionResource} object from the pool, or create a
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * new one if the pool is empty. Callers should make sure that the object
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * is returned to the pool by calling
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * {@link #releaseConnection(ConnectionResource)} after they are finished
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * with it.
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen *
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * @return a {@code ConnectionResource} object
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * @throws SQLException if a database error occurs
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen */
d10fb4b3f871cf4d673fd0696ed9f81e7046f9c2Vladimir Kotal public synchronized ConnectionResource getConnectionResource() throws SQLException {
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen ConnectionResource cr = connections.poll();
8e14a0491936db09f4ec93d8bcc7a6f6626a59c4Knut Anders Hatlen if (cr == null || !cr.isValid()) {
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen cr = new ConnectionResource(this);
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen }
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen return cr;
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen }
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen /**
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen * Return a {@code ConnectionResource} back to the pool.
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen *
db50fcedc48aaf1639dd7d1f0fac5f7d68f5c4c2Lubos Kosco * @param cr connection resource object
db50fcedc48aaf1639dd7d1f0fac5f7d68f5c4c2Lubos Kosco * @throws SQLException if any error occurs
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen */
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen public void releaseConnection(ConnectionResource cr) throws SQLException {
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen cr.rollback();
567950de13c6cd5dd7403fce4cadf818c3b8668cKnut Anders Hatlen connections.offer(cr);
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen }
c1dbb9010d910ca33e270c316ae2b29087dd363eKnut Anders Hatlen}