package jef.database; import java.nio.charset.Charset; import jef.database.meta.MetaHolder; import jef.database.meta.MetadataFacade; import jef.database.support.SqlLog; import jef.jre5support.ProcessUtil; import jef.tools.JefConfiguration; import jef.tools.JefConfiguration.Item; /** * all configuration values of ORM. * * JMX支持 * * @author jiyi * */ public class ORMConfig implements ORMConfigMBean { private static ORMConfig instance = new ORMConfig(); private MetadataFacade metaFacade = new MetadataFacade(); private String serverName; public static ORMConfig getInstance() { return instance; } public ORMConfig() { init(); } /** * 调试模式 */ protected boolean debugMode; /** * 打印出文本型数据字段的实际编码后长度。将字符编码一次来输出长度有不小的开销,默认关闭 */ private boolean showStringLength; /** * 过滤不存在的分区表 */ private boolean filterAbsentTables; /** * 按需建表(分区表) */ private boolean partitionCreateTableInneed; /** * 内存排序和聚合等计算的最大支持结果数 */ private int partitionInMemoryMaxRows; /** * Lob等数据流映射到String时的编码 */ private String dbEncoding; /** * Lob等数据流映射到String时的编码 */ private Charset dbEncodingCharset; /** * 全局一次性查询限制 */ private int globalMaxResults; /** * 是否单数据源模式 */ private boolean singleSite; /** * 全局最大一次性查询数量限制 */ private int globalFetchSize; /** * 批操作下日志显示参数最大条数 */ private int maxBatchLog; /** * 全局查询超时 */ private int selectTimeout; /** * 全局更新超时 */ private int updateTimeout; /** * 全局删除超时 */ private int deleteTimeout; /** * 缓存结果集 */ private boolean cacheResultset; /** * 改写Oracle时允许移除StartWith子句 */ private boolean allowRemoveStartWith; /** * 检查类是否增强 */ private boolean checkEnhancement; /** * 不使用 t.*,指定每个列名 */ private boolean specifyAllColumnName; /** * 插入省略未赋值字段 */ private boolean dynamicInsert; /** * 更新时省略未赋值字段 */ private boolean dynamicUpdate; /** * 安全的对比更新 */ private boolean safeMerge; /** * 外连接一次查询出关系 */ private boolean useOuterJoin; /** * 为Postgres使用恢复点来保证事务延续 */ private boolean keepTxForPG; /** * 允许手工指定自增值 */ private boolean manualSequence; /** * 允许空查询 */ private boolean allowEmptyQuery; /** * 允许延迟加载 */ private boolean enableLazyLoad; /** * 启用/禁用一级缓存 */ private boolean cacheLevel1; /** * 缓存是否开启调试,这项配置不能在外部配置,默认是flase,只能通过代码或JMX开启 */ public volatile boolean cacheDebug; /** * 二级缓存的生存周期,为0时禁用二级缓存。 */ private int cacheLevel2; /** * 定期检查连接 */ private long heartBeatSleep; private boolean formatSQL; /** * 可以创建序列 * */ private boolean autoCreateSequence; /** * 是否设置事务隔离级别 */ private boolean setTxIsolation; /** * 命名查询检查更新 */ private boolean checkUpdateForNamedQueries; /** * in条件中允许出现的最多参数。缺省500个。 */ private int maxInConditions; private boolean jpaContinueCommitIfError; /** * 多站点查询时启用并行查询 */ private int parallelSelect; /** * 将自增实现的两种常用实现映射为AUTO */ private boolean generateBySequenceAndIdentityToAUTO; private boolean enableLazyLob; public String wrap = ""; public String wrapt = ""; private boolean checkSqlFunctions; private String partitionBucketRange; @SuppressWarnings("deprecation") private void init() { partitionBucketRange=JefConfiguration.get(DbCfg.PARTITION_BUCKET_RANGE,"0-1023:"); showStringLength = JefConfiguration.getBoolean(DbCfg.DB_ENCODING_SHOWLENGTH, false); setDbEncoding(JefConfiguration.get(DbCfg.DB_ENCODING, Charset.defaultCharset().name())); globalMaxResults = JefConfiguration.getInt(DbCfg.DB_MAX_RESULTS_LIMIT, 0); globalFetchSize = JefConfiguration.getInt(DbCfg.DB_FETCH_SIZE, 0); debugMode = JefConfiguration.getBoolean(Item.DB_DEBUG, false); maxBatchLog = JefConfiguration.getInt(DbCfg.DB_MAX_BATCH_LOG, 5); selectTimeout = JefConfiguration.getInt(DbCfg.DB_SELECT_TIMEOUT, 60); updateTimeout = JefConfiguration.getInt(DbCfg.DB_UPDATE_TIMEOUT, 60); deleteTimeout = JefConfiguration.getInt(DbCfg.DB_DELETE_TIMEOUT, 60); cacheResultset = JefConfiguration.getBoolean(DbCfg.DB_CACHE_RESULTSET, false); singleSite = JefConfiguration.getBoolean(DbCfg.DB_SINGLE_DATASOURCE, false); allowRemoveStartWith = JefConfiguration.getBoolean(DbCfg.ALLOW_REMOVE_START_WITH, false); checkEnhancement = JefConfiguration.getBoolean(DbCfg.DB_FORCE_ENHANCEMENT, true); specifyAllColumnName = JefConfiguration.getBoolean(DbCfg.DB_SPECIFY_ALLCOLUMN_NAME, false); dynamicInsert = JefConfiguration.getBoolean(DbCfg.DB_DYNAMIC_INSERT, false); dynamicUpdate = JefConfiguration.getBoolean(DbCfg.DB_DYNAMIC_UPDATE, true); safeMerge = JefConfiguration.getBoolean(DbCfg.DB_SAFE_MERGE, false); useOuterJoin = JefConfiguration.getBoolean(DbCfg.DB_USE_OUTER_JOIN, true); keepTxForPG = JefConfiguration.getBoolean(DbCfg.DB_KEEP_TX_FOR_POSTGRESQL, true); manualSequence = JefConfiguration.getBoolean(DbCfg.DB_SUPPORT_MANUAL_GENERATE, false); allowEmptyQuery = JefConfiguration.getBoolean(DbCfg.ALLOW_EMPTY_QUERY, true); enableLazyLoad = JefConfiguration.getBoolean(DbCfg.DB_ENABLE_LAZY_LOAD, true); enableLazyLob = JefConfiguration.getBoolean(DbCfg.DB_LOB_LAZY_LOAD, false); cacheLevel1 = JefConfiguration.getBoolean(DbCfg.CACHE_LEVEL_1, false); cacheLevel2=JefConfiguration.getInt(DbCfg.CACHE_GLOBAL_EXPIRE_TIME, 0); cacheDebug = System.getProperty("cache.debug") != null; setFormatSQL(JefConfiguration.getBoolean(DbCfg.DB_FORMAT_SQL, false)); heartBeatSleep = JefConfiguration.getLong(DbCfg.DB_HEARTBEAT, 120000); setTxIsolation = JefConfiguration.getBoolean(DbCfg.DB_SET_ISOLATION, true); checkUpdateForNamedQueries = JefConfiguration.getBoolean(DbCfg.DB_NAMED_QUERY_UPDATE, debugMode); checkSqlFunctions = JefConfiguration.getBoolean(DbCfg.DB_CHECK_SQL_FUNCTIONS, true); filterAbsentTables = JefConfiguration.getBoolean(DbCfg.PARTITION_FILTER_ABSENT_TABLES, true); partitionCreateTableInneed = JefConfiguration.getBoolean(DbCfg.PARTITION_CREATE_TABLE_INNEED, true); partitionInMemoryMaxRows = JefConfiguration.getInt(DbCfg.PARTITION_INMEMORY_MAXROWS, 0); autoCreateSequence = JefConfiguration.getBoolean(DbCfg.AUTO_SEQUENCE_CREATION, true); maxInConditions = JefConfiguration.getInt(DbCfg.DB_MAX_IN_CONDITIONS, 500); parallelSelect = JefConfiguration.getInt(DbCfg.PARTITION_PARALLEL, 3); jpaContinueCommitIfError = JefConfiguration.getBoolean(DbCfg.DB_JPA_CONTINUE_COMMIT_IF_ERROR, false); generateBySequenceAndIdentityToAUTO=JefConfiguration.getBoolean(DbCfg.DB_AUTOINCREMENT_NATIVE, false); } public int getMaxInConditions() { return maxInConditions; } public void setMaxInConditions(int maxInConditions) { this.maxInConditions = maxInConditions; } public boolean isAutoCreateSequence() { return autoCreateSequence; } public void setAutoCreateSequence(boolean autoCreateSequence) { this.autoCreateSequence = autoCreateSequence; } public boolean isPartitionCreateTableInneed() { return partitionCreateTableInneed; } public void setPartitionCreateTableInneed(boolean partitionCreateTableInneed) { this.partitionCreateTableInneed = partitionCreateTableInneed; } public boolean isFilterAbsentTables() { return filterAbsentTables; } public void setFilterAbsentTables(boolean filterAbsentTables) { this.filterAbsentTables = filterAbsentTables; } public boolean isCheckUpdateForNamedQueries() { return checkUpdateForNamedQueries; } public void setCheckUpdateForNamedQueries(boolean checkUpdateForNamedQueries) { this.checkUpdateForNamedQueries = checkUpdateForNamedQueries; } public boolean isEnableLazyLoad() { return enableLazyLoad; } public void setEnableLazyLoad(boolean enableLazyLoad) { this.enableLazyLoad = enableLazyLoad; } public boolean isEnableLazyLob() { return enableLazyLob; } public void setEnableLazyLob(boolean enableLazyLob) { this.enableLazyLob = enableLazyLob; } public boolean isAllowEmptyQuery() { return allowEmptyQuery; } public void setAllowEmptyQuery(boolean allowEmptyQuery) { this.allowEmptyQuery = allowEmptyQuery; } public boolean isManualSequence() { return manualSequence; } public void setManualSequence(boolean manualSequence) { this.manualSequence = manualSequence; } public boolean isKeepTxForPG() { return keepTxForPG; } public void setKeepTxForPG(boolean keepTxForPG) { this.keepTxForPG = keepTxForPG; } public boolean isUseOuterJoin() { return useOuterJoin; } public void setUseOuterJoin(boolean useOuterJoin) { this.useOuterJoin = useOuterJoin; } public String getDbEncoding() { return dbEncoding; } public void setDbEncoding(String dbEncoding) { this.dbEncoding = dbEncoding; this.dbEncodingCharset = Charset.forName(dbEncoding); } public boolean isShowStringLength() { return showStringLength; } public void setShowStringLength(boolean showStringLength) { this.showStringLength = showStringLength; } public Charset getDbEncodingCharset() { return dbEncodingCharset; } public int getGlobalMaxResults() { return globalMaxResults; } public boolean isCheckSqlFunctions() { return checkSqlFunctions; } public void setCheckSqlFunctions(boolean checkSqlFunctions) { this.checkSqlFunctions = checkSqlFunctions; } public void setGlobalMaxResults(int globalMaxResults) { this.globalMaxResults = globalMaxResults; QueryOption.DEFAULT.setMaxResult(globalMaxResults); QueryOption.DEFAULT_MAX1.setMaxResult(globalMaxResults); } public boolean isDebugMode() { return debugMode; } public void setDebugMode(boolean debugMode) { this.debugMode = debugMode; } public int getGlobalFetchSize() { return globalFetchSize; } public void setGlobalFetchSize(int globalFetchSize) { this.globalFetchSize = globalFetchSize; QueryOption.DEFAULT.setFetchSize(globalFetchSize); QueryOption.DEFAULT_MAX1.setFetchSize(globalFetchSize); } public int getMaxBatchLog() { return maxBatchLog; } public void setMaxBatchLog(int maxBatchLog) { this.maxBatchLog = maxBatchLog; } public int getSelectTimeout() { return selectTimeout; } public void setSelectTimeout(int selectTimeout) { this.selectTimeout = selectTimeout; QueryOption.DEFAULT.setQueryTimeout(selectTimeout); QueryOption.DEFAULT_MAX1.setQueryTimeout(selectTimeout); } public int getUpdateTimeout() { return updateTimeout; } public void setUpdateTimeout(int updateTimeout) { this.updateTimeout = updateTimeout; } public int getDeleteTimeout() { return deleteTimeout; } public void setDeleteTimeout(int deleteTimeout) { this.deleteTimeout = deleteTimeout; } public boolean isCacheResultset() { return cacheResultset; } public boolean isSingleSite() { return singleSite; } public int getParallelSelect() { return parallelSelect; } public void setParallelSelect(int parallelSelect) { this.parallelSelect = parallelSelect; } public void setSingleSite(boolean singleSite) { this.singleSite = singleSite; } public boolean isAllowRemoveStartWith() { return allowRemoveStartWith; } public void setAllowRemoveStartWith(boolean allowRemoveStartWith) { this.allowRemoveStartWith = allowRemoveStartWith; } public boolean isCheckEnhancement() { return checkEnhancement; } public void setCheckEnhancement(boolean checkEnhancement) { this.checkEnhancement = checkEnhancement; } public boolean isSpecifyAllColumnName() { return specifyAllColumnName; } public void setSpecifyAllColumnName(boolean specifyAllColumnName) { this.specifyAllColumnName = specifyAllColumnName; } public boolean isDynamicInsert() { return dynamicInsert; } public void setDynamicInsert(boolean dynamicInsert) { this.dynamicInsert = dynamicInsert; } public boolean isDynamicUpdate() { return dynamicUpdate; } public void setDynamicUpdate(boolean dynamicUpdate) { this.dynamicUpdate = dynamicUpdate; } public boolean isCacheLevel1() { return cacheLevel1; } public void setCacheLevel1(boolean cacheLevel1) { this.cacheLevel1 = cacheLevel1; } public void setCacheResultset(boolean cacheResultset) { this.cacheResultset = cacheResultset; QueryOption.DEFAULT.setCacheResultset(cacheResultset); QueryOption.DEFAULT_MAX1.setCacheResultset(cacheResultset); } public boolean isCacheDebug() { return cacheDebug; } public void setCacheDebug(boolean cacheDebug) { this.cacheDebug = cacheDebug; } public boolean isFormatSQL() { return formatSQL; } public void setFormatSQL(boolean value) { this.formatSQL = value; this.wrap = formatSQL ? "\n" : ""; this.wrapt = formatSQL ? "\n\t" : ""; } public long getHeartBeatSleep() { return heartBeatSleep; } public void setHeartBeatSleep(long heartBeatSleep) { this.heartBeatSleep = heartBeatSleep; } public String getServerName() { if (serverName == null) { serverName = ProcessUtil.getServerName(); } return serverName; } public String getHostIp() { return ProcessUtil.getLocalIp(); } public int getLoadedEntityCount() { return metaFacade.getLoadedEntityCount(); } public void clearMetadatas() { metaFacade.clearMetadatas(); } public String getSchemaMapping() { return metaFacade.getSchemaMapping(); } public void setSchemaMapping(String data) { metaFacade.setSchemaMapping(data); } public String getSiteMapping() { return metaFacade.getSiteMapping(); } public void setSiteMapping(String data) { metaFacade.setSiteMapping(data); } public boolean isSetTxIsolation() { return setTxIsolation; } public void setSetTxIsolation(boolean setTxIsolation) { this.setTxIsolation = setTxIsolation; } public String getMetadataResourcePattern() { if (metaFacade.getDefaultMeta() == null) { return "-"; } return metaFacade.getDefaultMeta().getPattern(); } public int getPartitionInMemoryMaxRows() { return partitionInMemoryMaxRows; } public void setPartitionInMemoryMaxRows(int partitionInMemoryMaxRows) { this.partitionInMemoryMaxRows = partitionInMemoryMaxRows; } public boolean isJpaContinueCommitIfError() { return jpaContinueCommitIfError; } public void setJpaContinueCommitIfError(boolean jpaContinueCommitIfError) { this.jpaContinueCommitIfError = jpaContinueCommitIfError; } public void setMetadataResourcePattern(String pattern) { MetaHolder.getMappingSchema(""); if (metaFacade.getDefaultMeta() == null) { return; } metaFacade.getDefaultMeta().setPattern(pattern); } public SqlLog newLogger(int len){ if(debugMode){ return new SqlLog.LogImpl(len); }else { return SqlLog.DUMMY; } } public SqlLog newLogger(){ if(debugMode){ return new SqlLog.LogImpl(); }else { return SqlLog.DUMMY; } } public String getPartitionBucketRange() { return partitionBucketRange; } public void setPartitionBucketRange(String partitionBucketRange) { this.partitionBucketRange = partitionBucketRange; } public boolean isGenerateBySequenceAndIdentityToAUTO() { return generateBySequenceAndIdentityToAUTO; } public void setGenerateBySequenceAndIdentityToAUTO(boolean generateBySequenceAndIdentityToAUTO) { this.generateBySequenceAndIdentityToAUTO = generateBySequenceAndIdentityToAUTO; } public SqlLog newLogger(boolean isDummy){ if(debugMode && !isDummy){ return new SqlLog.LogImpl(); }else{ return SqlLog.DUMMY; } } public boolean isSafeMerge() { return safeMerge; } public void setSafeMerge(boolean safeMerge) { this.safeMerge = safeMerge; } /** * 二级缓存的生存周期,为0时禁用二级缓存。 * 该值必须在DbClient对象创建之前设置。对象创建后再设置无效 * @return */ public int getCacheLevel2() { return cacheLevel2; } public void setCacheLevel2(int cacheLevel2) { this.cacheLevel2 = cacheLevel2; } }