001/* 002 * HA-JDBC: High-Availability JDBC 003 * Copyright (c) 2004-2007 Paul Ferraro 004 * 005 * This library is free software; you can redistribute it and/or modify it 006 * under the terms of the GNU Lesser General Public License as published by the 007 * Free Software Foundation; either version 2.1 of the License, or (at your 008 * option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, but WITHOUT 011 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 012 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 013 * for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public License 016 * along with this library; if not, write to the Free Software Foundation, 017 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018 * 019 * Contact: ferraro@users.sourceforge.net 020 */ 021package net.sf.hajdbc.cache; 022 023import java.sql.Connection; 024import java.sql.SQLException; 025 026import net.sf.hajdbc.Balancer; 027import net.sf.hajdbc.Database; 028import net.sf.hajdbc.DatabaseProperties; 029import net.sf.hajdbc.Dialect; 030 031/** 032 * DatabaseMetaDataCache implementation that eagerly caches data when first flushed. 033 * To be used when performance more of a concern than memory usage. 034 * 035 * @author Paul Ferraro 036 * @since 2.0 037 */ 038public class EagerDatabaseMetaDataCache<D> extends AbstractDatabaseMetaDataCache 039{ 040 private volatile DatabaseProperties properties; 041 private final Balancer<D> balancer; 042 043 public EagerDatabaseMetaDataCache(Dialect dialect, Balancer<D> balancer) 044 { 045 super(dialect); 046 047 this.balancer = balancer; 048 } 049 050 /** 051 * @see net.sf.hajdbc.DatabaseMetaDataCache#flush() 052 */ 053 @Override 054 public void flush() throws SQLException 055 { 056 Database<D> database = this.balancer.next(); 057 058 this.setDatabaseProperties(database.connect(database.createConnectionFactory())); 059 } 060 061 /** 062 * @see net.sf.hajdbc.DatabaseMetaDataCache#getDatabaseProperties(java.sql.Connection) 063 */ 064 @Override 065 public synchronized DatabaseProperties getDatabaseProperties(Connection connection) throws SQLException 066 { 067 if (this.properties == null) 068 { 069 this.setDatabaseProperties(connection); 070 } 071 072 return this.properties; 073 } 074 075 private synchronized void setDatabaseProperties(Connection connection) throws SQLException 076 { 077 this.properties = new EagerDatabaseProperties(connection.getMetaData(), this.factory, this.dialect); 078 } 079}