Mercurial > dive4elements > framework
view artifact-database/src/main/java/org/dive4elements/artifactdatabase/db/SQLExecutor.java @ 540:91b1435fb9ea
Added R/W lock to SQLExecutor.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 03 Sep 2015 11:46:24 +0200 |
parents | 415df0fc4fa1 |
children | 3b1e48d22ce0 |
line wrap: on
line source
package org.dive4elements.artifactdatabase.db; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.sql.DataSource; import org.apache.log4j.Logger; public class SQLExecutor { private static Logger logger = Logger.getLogger(SQLExecutor.class); public class Instance { public Connection conn; public PreparedStatement stmnt; public ResultSet result; public Instance() { } public void reset() throws SQLException { if (result != null) { result.close(); result = null; } if (stmnt != null) { result = null; stmnt.close(); } } public PreparedStatement prepareStatement(String query) throws SQLException { return stmnt = conn.prepareStatement(query); } public void close() { if (result != null) { try { result.close(); } catch (SQLException sqle) {} } if (stmnt != null) { try { stmnt.close(); } catch (SQLException sqle) {} } if (conn != null) { try { conn.close(); } catch (SQLException sqle) {} } } public boolean runWrite() { rwLock.writeLock().lock(); try { DataSource dataSource = dbConnection.getDataSource(); try { conn = dataSource.getConnection(); try { conn.setAutoCommit(false); return doIt(); } catch (SQLException sqle) { conn.rollback(); throw sqle; } } catch (SQLException sqle) { logger.error(sqle.getLocalizedMessage(), sqle); } finally { close(); } return false; } finally { rwLock.writeLock().unlock(); } } public boolean runRead() { rwLock.readLock().lock(); try { DataSource dataSource = dbConnection.getDataSource(); try { conn = dataSource.getConnection(); return doIt(); } catch (SQLException sqle) { logger.error(sqle.getLocalizedMessage(), sqle); } finally { close(); } return false; } finally { rwLock.readLock().unlock(); } } public boolean doIt() throws SQLException { return true; } } // class Instance protected DBConnection dbConnection; protected ReentrantReadWriteLock rwLock; public SQLExecutor() { rwLock = new ReentrantReadWriteLock(); } public SQLExecutor(DBConnection dbConnection) { this(); this.dbConnection = dbConnection; } public DBConnection getDBConnection() { return dbConnection; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :