package org.dayatang.configuration.impl; import org.dayatang.configuration.WritableConfiguration; import org.dayatang.utils.Assert; import org.dayatang.utils.Slf4JLogger; import javax.sql.DataSource; import java.util.Date; /** * <P>ConfigurationDbImpl为读取/回写配置信息的工具类,并将配置信息写入数据库, 具体配置大致采用 * ConfigurationFileImpl.getXxx(key)的方式读取。</P> * <P>每个配置项用key --> value 的方式组织,推荐采用点分字符串的方式编制key部分。 usePrefix()激活 * 配置项前缀功能,你可以通过usePrefix("xxx.xxx")设置某个具体实例的前缀。</P> * <P>前缀的作用在于减少复杂性,如果我们在配置文件里有org.dayatang.smbserverhost=smbserverhost.com * 这一项,并且不更改默认前缀的话,getXxx("smbserverhost")和get("org.dayatang.smbserverhost") * 将会返回同样的结果。</P> * <P>配置文件的格式符合标准的java属性文件格式,采用UTF8的编码方式,支持中文,不需native2ascii。</P> * <P>注意:为了避免日期格式的转换等复杂问题,日期是转化为long类型的数据保存的(采用date.getTime()方法)。</P> * * @author yyang (<a href="mailto:gdyangyu@gmail.com">gdyangyu@gmail.com</a>) */ public class ConfigurationDbImpl extends AbstractConfiguration implements WritableConfiguration { private static final Slf4JLogger LOGGER = Slf4JLogger.getLogger(ConfigurationDbImpl.class); private ConfigurationDbUtils dbUtils; private static final String DEFAULT_TABLE_NAME = "SYS_CONFIG"; private static final String DEFAULT_KEY_COLUMN = "KEY_COLUMN"; private static final String DEFAULT_VALUE_COLUMN = "VALUE_COLUMN"; public ConfigurationDbImpl(DataSource dataSource) { this(dataSource, DEFAULT_TABLE_NAME, DEFAULT_KEY_COLUMN, DEFAULT_VALUE_COLUMN); } public ConfigurationDbImpl(DataSource dataSource, String tableName, String keyColumn, String valueColumn) { Assert.notNull(dataSource, "Data source is null!"); Assert.notEmpty(tableName, "Table name is blank!"); Assert.notEmpty(tableName, "Key column is blank!"); Assert.notEmpty(tableName, "Value column is blank!"); dbUtils = new ConfigurationDbUtils(dataSource, tableName, keyColumn, valueColumn); } //从数据库中取得配置项,更新当前内存中的配置值。 @Override public void load() { hTable = dbUtils.load(); LOGGER.debug("Configuration info loaded from database at {}", new Date()); } /* (non-Javadoc) * @see org.dayatang.configuration.WritableConfiguration#save() */ @Override public void save() { dbUtils.save(hTable); } }