com.splout.db.common.SQLiteJDBCManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of splout-commons Show documentation
Show all versions of splout-commons Show documentation
Splout is a read only, horizontally scalable SQL database that plays well with Hadoop.
package com.splout.db.common;
/*
* #%L
* Splout SQL commons
* %%
* Copyright (C) 2012 Datasalt Systems S.L.
* %%
* Licensed 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.
* #L%
*/
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.jolbox.bonecp.BoneCP;
import com.jolbox.bonecp.BoneCPConfig;
import com.splout.db.common.JSONSerDe.JSONSerDeException;
/**
* SQL Wrapper for querying SQLite through a connection pool using BoneCP (http://jolbox.com/).
*/
public class SQLiteJDBCManager implements ISQLiteManager {
private final static Log log = LogFactory.getLog(SQLiteJDBCManager.class);
BoneCP connectionPool = null;
public SQLiteJDBCManager(String dbFile, int nConnections) throws SQLException, ClassNotFoundException {
// Load the sqlite-JDBC driver using the current class loader
Class.forName("org.sqlite.JDBC");
BoneCPConfig config = new BoneCPConfig();
config.setJdbcUrl("jdbc:sqlite:" + dbFile);
config.setMinConnectionsPerPartition(nConnections);
config.setMaxConnectionsPerPartition(nConnections);
config.setUsername("foo");
config.setPassword("foo");
config.setPartitionCount(1);
connectionPool = new BoneCP(config); // setup the connection pool
}
public Connection getConnectionFromPool() throws SQLException {
return connectionPool.getConnection();
}
/**
* The contract of this function is to return a JSON-ized ArrayList of JSON Objects which in Java are represented as
* Map. So, for a query with no results, an empty ArrayList is returned.
*/
public String query(String query, int maxResults) throws SQLException, JSONSerDeException {
long start = System.currentTimeMillis();
Connection connection = connectionPool.getConnection(); // fetch a connection
Statement stmt = null;
ResultSet rs = null;
try {
stmt = connection.createStatement();
String result = null;
if(stmt.execute(query)) {
rs = stmt.getResultSet();
result = JSONSerDe.ser(convertResultSetToList(rs, maxResults));
} else {
result = JSONSerDe.ser(new ArrayList>());
}
long end = System.currentTimeMillis();
log.info(Thread.currentThread().getName() + ": Query [" + query + "] handled in [" + (end - start)
+ "] ms.");
return result;
} finally {
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
connection.close();
}
}
// -------- //
private static List> convertResultSetToList(ResultSet rs, int maxResults)
throws SQLException {
ResultSetMetaData md = rs.getMetaData();
int columns = md.getColumnCount();
List> list = new ArrayList>();
while(rs.next() && list.size() < maxResults) {
HashMap row = new HashMap(columns);
for(int i = 1; i <= columns; ++i) {
row.put(md.getColumnName(i), rs.getObject(i));
}
list.add(row);
}
if(list.size() == maxResults) {
throw new SQLException("Hard limit on number of results reached (" + maxResults + "), please use a LIMIT for this query.");
}
return list;
}
public void close() {
connectionPool.shutdown();
}
@Override
public String exec(String query) throws SQLException, JSONSerDeException {
return query(query, 1);
}
}