bboss持久层查询元数据缓存机制开启方法

简介:     bboss持久层为了提升数据库查询操作性能,提供了对查询字段信息、字段对应的java filed名称信息等元数据(后文统称为查询元数据)进行缓存的机制,bboss持久层为数据源额外提供了控制参数cachequerymetadata来控制是否缓存这些查询元数据。
    bboss持久层为了提升数据库查询操作性能,提供了对查询字段信息、字段对应的java filed名称信息等元数据(后文统称为查询元数据)进行缓存的机制,bboss持久层为数据源额外提供了控制参数cachequerymetadata来控制是否缓存这些查询元数据。cachequerymetadata为true时开启缓存机制,为false时关闭缓存机制,默认为true。
   cachequerymetadata的设置方法。在poolman.xml文件的datasource元素中进行配置,实例如下:
   
<datasource>

		<dbname>bspf</dbname>
		<loadmetadata>false</loadmetadata>
		<enablejta>true</enablejta>
		<jndiName>druid_datasource_jndiname</jndiName>
		<datasourceFile>druid-mysql.xml</datasourceFile>
		<autoprimarykey>false</autoprimarykey>
		<showsql>true</showsql>
		<keygenerate>composite</keygenerate>
		<cachequerymetadata>true</cachequerymetadata>
	</datasource>


对于缓存查询元数据的缓存容器和缓存key的说明:
缓存容器,根据程序使用的查询组件有不同的容器
ConfigSQLExecutor组件:
一个ConfigSQLExecutor组件加载一个xml配置文件,同时也会为这个ConfigSQLExecutor组件创建一个查询元数据缓存容器,当xml文件中的sql语句被修改后,ConfigSQLExecutor组件会重新loadxml文件的sql,同时也会重置对应的查询元数据缓存容器。这个缓存容器中缓存查询元数据的key,可能是配置的sql对应的别名,也可能是经过bboss解析后最终生成的sql语句。
例如下面的sql就是以getCopyTaskReadUsers作为查询元数据的缓存key:
<property name="getCopyTaskReadUsers">
		<![CDATA[
		select ID,
				        copyid,
				        COPORG,
				        COPER,
				        PROCESS_ID,
				        PROCESS_KEY,
				        BUSINESSKEY,
				        COPYTIME,
				        READTIME,
				         ACT_ID,
				        act_name,
				        act_instid,
				        COPERCNName from td_wf_hi_copytask  where act_instid=? and COPER is not null  ORDER by READTIME asc
		]]>
	</property>

getCopyTaskReadUsers之所以能作为缓存key是因为对应的sql是一条确定的sql语句,没有velocity动态变量(类似$varname格式的变量),也没用velocity动态逻辑判断和foreach循环语句。下面的sql就不能用名称getUserReaderCopyTasks作为缓存key:
<property name="getUserReaderCopyTasks">
		<![CDATA[
		select ID,
				        copyid,
				        COPORG,
				        COPER,
				        PROCESS_ID,
				        PROCESS_KEY,
				        BUSINESSKEY,
				        COPYTIME,
				        READTIME,
				         ACT_ID,
				        act_name,
				        act_instid,
				        COPERCNName from td_wf_hi_copytask  where 1=1 and 
				        #if(!$isAdmin)				        
				        	COPER=#[user]				        
				        #end
				        #if($process_key && !$process_key.equals("")) 
							and PROCESS_KEY = #[process_key]
					  	#end	
					  	#if($businesskey && !$businesskey.equals("")) 
							and BUSINESSKEY = #[businesskey]
					  	#end
					  	ORDER by READTIME asc	
		]]>
	</property>

因为getUserReaderCopyTasks对应的sql根据实际运行的参数不同而不同,所以必须以最终生成的sql作为元数据的查询元数据缓存key。

SQLExecutor组件/PreparedDBUtil组件:由于这两个组件直接使用sql语句进行查询,所以他们统一使用一个全局查询元数据容器,只有在jvm退出时,这个全局容器才会被销毁。这个容器缓存查询元数据是以sql语句作为缓存key。

缓存的元数据全部采用软缓存SoftReference,在jvm内存不够时会进行自动回收。

当以sql作为查询元数据缓存key时,如果sql语句中包含查询通配符*时,如果在数据库表中增加了字段,但是应用没有重启,可能会导致or mapping机制不能正确工作,所以如果数据在有以下查询sql语句的情况下:select n.*,t.name from a n,b m where n.id = m.fid,往a表中增加了字段,需要重启一下应用,否则缓存的元数据会没有包含新的a表中新加的字段,导致o/r mapping不能正确工作,或者将n.*改为查询具体的字段,也不会存在问题,例如:n.id,n.name等等。
目录
相关文章
|
2月前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
3月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
94 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
32 1
|
1月前
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
63 4
|
2月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
75 10
|
2月前
|
缓存 监控 NoSQL
Redis 缓存穿透的检测方法与分析
【10月更文挑战第23天】通过以上对 Redis 缓存穿透检测方法的深入探讨,我们对如何及时发现和处理这一问题有了更全面的认识。在实际应用中,我们需要综合运用多种检测手段,并结合业务场景和实际情况进行分析,以确保能够准确、及时地检测到缓存穿透现象,并采取有效的措施加以解决。同时,要不断优化和改进检测方法,提高检测的准确性和效率,为系统的稳定运行提供有力保障。
61 5
|
3月前
|
存储 缓存 索引
从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低
本文详细对比了ArrayList和LinkedList的查询效率,从底层数据结构和CPU缓存两个方面进行分析。ArrayList基于动态数组,支持随机访问,查询时间复杂度为O(1),且CPU缓存对其友好;而LinkedList基于双向链表,需要逐个节点遍历,查询时间复杂度为O(n),且CPU缓存对其帮助不大。文章还探讨了CPU缓存对数组增删操作的影响,指出缓存主要作用于读取而非修改。通过这些分析,加深了对这两种数据结构的理解。
57 2
|
3月前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
114 4
|
3月前
|
存储 缓存 NoSQL
深入理解后端缓存机制的重要性与实践
本文将探讨在后端开发中缓存机制的应用及其重要性。缓存,作为提高系统性能和用户体验的关键技术,对于后端开发来说至关重要。通过减少数据库访问次数和缩短响应时间,缓存可以显著提升应用程序的性能。本文将从缓存的基本概念入手,介绍常见的缓存策略和实现方式,并通过实例展示如何在后端开发中有效应用缓存技术。最后,我们将讨论缓存带来的一些挑战及其解决方案,帮助您在实际项目中更好地利用缓存机制。
|
3月前
|
缓存 NoSQL 算法
解决Redis缓存雪崩问题的有效方法
解决Redis缓存雪崩问题的有效方法
54 1