All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jp.sf.amateras.mirage.session.JDBCSessionImpl Maven / Gradle / Ivy

package jp.sf.amateras.mirage.session;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

import jp.sf.amateras.mirage.SqlManager;
import jp.sf.amateras.mirage.SqlManagerImpl;
import jp.sf.amateras.mirage.dialect.Dialect;
import jp.sf.amateras.mirage.exception.SessionException;
import jp.sf.amateras.mirage.provider.DefaultConnectionProvider;
import jp.sf.amateras.mirage.util.StringUtil;

/**
 * The default implementation of {@link Session}.
 * 

* This implementation set {@link Dialect} to {@link SqlManager} automatically by the JDBC connection URL. * * @author Naoki Takezoe */ public class JDBCSessionImpl implements Session { private static final Logger logger = Logger.getLogger(JDBCSessionImpl.class.getName()); private SqlManager sqlManager; private DefaultConnectionProvider provider; private String driver; private String url; private String user; private String password; private ThreadLocal rollbackOnly = new ThreadLocal(); /** * The constructor. * * @param properties the Properties object which has a following properties: *

    *
  • jdbc.driver - the JDBC driver classname (optional on JDBC 4.0)
  • *
  • jdbc.url - the JDBC connection URL
  • *
  • jdbc.user - the username
  • *
  • jdbc.password - the password
  • *
  • sql.cache - if true then SqlManager caches parsing result of 2waySQL
  • *
*/ public JDBCSessionImpl(Properties properties){ this.driver = properties.getProperty("jdbc.driver"); this.url = properties.getProperty("jdbc.url"); this.user = properties.getProperty("jdbc.user"); this.password = properties.getProperty("jdbc.password"); sqlManager = new SqlManagerImpl(); sqlManager.setDialect(DialectAutoSelector.getDialect(url)); provider = new DefaultConnectionProvider(); sqlManager.setConnectionProvider(provider); String cache = properties.getProperty("sql.cache"); if("true".equals(cache)){ ((SqlManagerImpl) sqlManager).setCacheMode(true); } else { ((SqlManagerImpl) sqlManager).setCacheMode(false); } } /** * {@inheritDoc} */ public void begin() { if(logger.isLoggable(Level.INFO)){ logger.info("Begin transaction."); } try { if(StringUtil.isNotEmpty(driver)){ Class.forName(driver); } Connection conn = DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); provider.setConnection(conn); } catch (ClassNotFoundException ex) { throw new SessionException("Driver class not found.", ex); } catch (SQLException ex){ throw new SessionException("Failed to begin transaction.", ex); } } /** * {@inheritDoc} */ public void commit() { if(logger.isLoggable(Level.INFO)){ logger.info("Commit transaction."); } try { provider.getConnection().commit(); } catch (SQLException ex){ throw new SessionException("Failed to commit transaction.", ex); } } public SqlManager getSqlManager() { return sqlManager; } public void release() { this.rollbackOnly.remove(); if(provider instanceof DefaultConnectionProvider){ ((DefaultConnectionProvider) provider).releaseConnection(); } } public void rollback() { if(logger.isLoggable(Level.INFO)){ logger.info("Rollback transaction."); } try { provider.getConnection().rollback(); } catch (SQLException ex){ throw new SessionException("Failed to rollback transaction.", ex); } } public void setRollbackOnly() { this.rollbackOnly.set(true); } public boolean isRollbackOnly() { return this.rollbackOnly.get() != null; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy