• [技术干货] PostgreSQL中in、exists、= any 的区别
    判断对象是否存在于某个子查询的3种写法在数据库中中,我们可以使用in、exists语句来判断对象是否存在某个子查询中。在PostgreSQL里,除了支持上述两种语法外,还支持= any的语法。例如下面这3个SQL返回的结果都是一样的select * from tbl where id in (select id from t); select * from tbl where exists (select 1 from t where t.id=tbl.id); select * from tbl where id = any (array( select id from t )); 性能分析in 操作: in 操作会在查询时遍历指定的范围,检查目标值是否在给定的范围内。如果范围内存在匹配的值,则结果为真。in 操作在以下情况下性能较好:范围较小:当给定的范围较小时,in 操作的性能较好,因为数据库可以快速地查找匹配的值。索引可用:如果查询涉及的自建索引包含目标范围,则 in 操作的性能会显著提高。exists 操作: exists 操作用于检查表中是否存在满足条件的记录。它会在查询时遍历表中的所有记录,判断给定条件是否满足。exists 操作在以下情况下性能较好:条件较简单:当查询条件较简单,如仅涉及单一列时,exists 操作的性能较好。数据量较小:数据量较小的情况下,exists 操作的性能优于 in 操作,因为 exists 操作不需要遍历范围,只需判断条件是否满足。= any 操作: = any 操作用于检查目标值是否存在于给定的值列表中。它会在查询时使用 UNION ALL 操作将给定的值列表与表中的数据进行比较。= any 操作在以下情况下性能较好:值列表较小:当给定的值列表较小时,= any 操作的性能较好,因为数据库可以快速地查找匹配的值。索引可用:如果查询涉及的自建索引包含目标值,则 = any 操作的性能会显著提高。 总结: 在实际应用中,in、exists 和 = any 的性能取决于数据量、范围和查询条件。在评估性能时,请根据具体场景和实际需求选择合适的操作。如果数据量较小且条件简单,可以考虑使用 exists 操作;如果需要使用索引,则 in 和 = any 操作可能具有更好的性能。在实际应用中,建议根据具体需求进行性能测试和优化。总结不同的写法,性能还是有一定的差距。可能对in、exists这两种写法比较熟悉的人都知道这么一个结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。具体的说:= any这种写法,不会走subplan,因此不涉及hash table的问题。和work_mem设置大小无关。因此在pg中十分推荐使用这种写法。exists,由于优化器会默认它只需要搜索到1条命中目标就不搜了,所以优化器评估是否使用hash table时,需要的内存相对较少,即使较小的work_mem也可能使用hashtable。in ,当出现在subquery中时,优化器评估这个subquery是否要构建哈希TABLE,直接和subquery的大小相关,所以需要较大的work_mem才会选择使用hashtable。
  • [技术干货] 存算分离架构
    典型分布式数据库系统架构数据库系统架构典型的架构有Shared Everything、Shared Memory、Shared Disk和Shared Nothing。这里Share的资源主要是指内存,磁盘。单机数据库系统称为shared everything,因为是单机节点,有自己独立的内存空间和独立的磁盘Shared Memory 现实中并不常见,多个cpu通过网络来共享一个内存地址空间,并且共享同一个disk。Shared Disk 多个数据库实例,每个实例有自己的内存,但是通过网络共享同一个disk。Shared Disk架构在云原生比较常见,这样的好处就是利于存算分离,计算层和存储层能够解耦,因此计算层和存储层在扩缩容的时候彼此不影响。缺点是因为共享disk,因此对于高并发的写请求势必性能会比较差,因此这种架构比较适合OLAP这种读多写少的数仓。Shared Nothing 各个数据库实例,都有自己的内存和disk,这些实例之间只能通过网络通信来感知各个实例的状态变化。通常表会水平划分到各个节点,每个节点只负责其本地磁盘上的数据行。 这种设计非常适合星型模式查询,因为连接维度比较小的维度表和宽的事实表所需的带宽非常少。Share Nothing架构的优点在于性能和效率比较高,缺点在于灵活性较差,因为扩缩容的时候,需要在节点之间移动数据。而且对于事物的支持性较差,因为各个节点之间必须通过网络进行协调。什么是存算分离存算分离是一种数据处理技术,它将数据存储和数据处理(计算)分开,使得存储和计算可以独立地进行优化和扩展。在这种架构下,存储系统负责存储和管理数据,而计算系统负责对数据进行处理和分析。这种技术旨在提高数据处理的效率、降低成本并满足大规模数据存储和分析的需求。为什么需要存算分离异构的工作负载: 得益于现在云原生的环境,用户可以自由配置每台云服务器的cpu型号,内存,磁盘,带宽。但是存在的问题是适合高 I/O 带宽、轻计算的系统配置不适合复杂查询,而适合复杂查询的系统配置却不能满足高吞吐的要求。简单的理解为需要在计算和IO之间做平衡。扩缩容: 由于计算和存储的耦合,当扩缩容的时候势必需要在节点之间移动数据,而节点同时需要对外提供计算服务,因此此时的性能可能会收到很大影响。如果存储分离,那么计算层和存储层可以独立增加减少节点而互不干扰。存算分离的优点存算分离的主要优点如下:高效性:存储和计算可以独立进行优化,使得存储系统可以专注于提高数据的存储和访问效率,计算系统可以专注于优化数据处理算法和提高计算性能。可扩展性:存算分离架构允许存储和计算资源独立扩展,方便应对不断增长的数据存储和处理需求。成本降低:通过将存储和计算分开,可以更加灵活地选择适合各自任务的硬件和软件,从而降低整体成本。灵活性:存算分离使得数据处理任务可以根据实际需求进行调整,如快速切换计算引擎、修改查询算法等。容错性:存算分离架构可以提高系统的容错性,当某个部件出现问题时,其他部分可以继续正常工作。易于维护:存算分离使得系统组件的维护和升级更加容易进行,无需对整个系统进行改造。 在实际应用中,存算分离技术已在大数据、云计算、人工智能等领域得到广泛应用。例如,海量数据公司自主研发的 Vastbase 海量数据库,就致力于提高数据库的存算分离能力,并向 openGauss 社区持续贡献代码。
  • [技术干货] 向量数据库简介
    向量数据库定义向量数据库(Vector Database)是一种专门用来处理向量嵌入(Vector Embedding)的数据库。它通过比较向量值并找到彼此相似的值来索引和检索数据,适用于处理复杂数据类型,如文档、图像、视频和网页等非结构化数据。向量数据库与传统数据库的主要区别在于数据存储方式、数据类型和应用场景。向量数据库与传统数据库的主要区别如下:数据存储方式:传统数据库通常采用表格形式存储结构化数据,如客户信息、订单记录等。向量数据库则将数据存储为高维空间中的点,通过向量表示数据,便于计算和比较相似度。数据类型:传统数据库主要处理结构化数据,如关系型数据。向量数据库可以处理非结构化数据,如文本、图像、音频等,并将这些数据转化为向量形式进行存储和检索。应用场景:传统数据库适用于处理关系型数据和结构化数据,如查询、统计和分析等任务。向量数据库适用于人工智能和机器学习领域,如相似度搜索、推荐系统、图像识别等任务。 向量数据库在处理非结构化数据和复杂场景方面具有优势,能够更快地找到相似的数据点,从而在搜索引擎、内容推荐、图像识别等领域发挥作用。随着大数据和人工智能技术的发展,向量数据库在未来有望得到更广泛的应用。常见的向量数据库向量数据库近年来逐渐受到关注,一些知名的向量数据库包括:Pinecone:这是一家成立于 2021 年的初创公司,专注于向量数据库领域。Pinecone 可以为各种应用提供高性能的向量搜索,包括计算机视觉、自然语言处理、音频识别等。该公司已成为 OpenAI 的合作伙伴,并获得了 7.5 亿美元的估值。Zilliz:作为一家中国初创公司,Zilliz 致力于提供高性能的向量数据库解决方案。其产品 Metis 向量数据库适用于各种场景,如广告推荐、内容审核、图像识别等。Zilliz 已完成数亿元人民币的融资。Chroma:Chroma 是一家成立于 2021 年的美国初创公司,专注于构建向量数据库。其产品可以处理大规模的图像、视频和文本数据,并应用于相似度搜索、推荐系统和内容审核等领域。Milvus:Milvus 是一款开源的向量数据库,由北京智臻科技有限公司开发。它可以处理多种非结构化数据类型,如文本、图像和音频等,并支持高效的向量搜索。Milvus 已在多个行业领域得到广泛应用,如智能客服、短视频推荐等。Faiss:Faiss(Facebook AI Similarity Search)是 Facebook 人工智能研究院开发的一款向量数据库。它旨在为大规模图像、文本和视频数据提供高效的相似度搜索功能。Faiss 已经开源,可供研究人员和开发者免费使用。 这些向量数据库在处理复杂数据类型和相似度搜索方面具有优势,随着人工智能技术的发展,它们在各个领域的应用将进一步拓宽。
  • [技术干货] openGauss数据库ODBC环境连接配置(Windows)
    Windows操作系统自带ODBC数据源管理器,无需用户手动安装管理器便可直接进行配置。操作步骤步骤一 下载客户端GaussDB驱动程序并进行安装:下载地址:cid:link_0在本地(例如D:/download)下载ZIP文件后进行解压缩,解压缩后文件如下。由于本实验openGauss安装在ECS(openEuler ARM)上,所以进入Euler2.8_arm_64文件夹,显示如下:解压缩GaussDB-Kernel-V500R001C10-Windows-Odbc.tar.gz文件,显示如下:点击psqlodbc_x86.msi进行安装:默认设置,直到安装完毕。步骤二 打开驱动管理器。在配置数据源时,请使用对应的驱动管理器(假设操作系统安装盘符为C盘,如果是其他盘符,请对路径做相应修改):64位操作系统上进行64位程序开发,安装64位驱动程序后,使用64位的驱动管理器:C:\Windows\System32\odbcad32.exe 或者直接使用“控制面板 > 管理工具 > ODBC 数据源(64 位)。步骤三 配置数据源。在打开的驱动管理器上,选择“用户DSN > 添加 > PostgreSQL Unicode(x64)”,然后进行配置:Data Source:openGauss (数据源名称,可以自定义)。Database:db_tpcc (需要连接的Datebase名称)。Server:openGauss数据库服务器的公网IP,请根据实际情况填写。Pot:26000 (端口号)。User Name:joe (连接数据库的用户名,不能使用omm用户,需要在数据库中创建)Password:dbuser用户的密码,请根据实际情况填写。步骤四 验证并保存设置。点击Test,显示 Connection successful 表示设置成功:点击保存:配置成功!
  • [问题求助] open gauss数据库和华为云mysql数据库区别
    open gauss数据库和华为云mysql数据库区别
  • [技术干货] 数据库论坛10月份热门问题合集
    数据库论坛10月份热门问题合集云数据库有哪些优点特点?cid:link_0相比自建数据库,云数据库在机房风火水电网络等基础设施方面、服务器部署及维护、数据库软件安装、数据库软件版本升级和补丁等云数据库相比自建数据库在机房、电力、空调、网络等基础设施方面节省了很多的人力、硬件、维护服务成本,尤其对于中小型企业,没有足够的财力和技术基础建设专业的机房网络等环境,则很容易导致各种各样让人抓狂的问题,比如机房所在的大楼动辄断电停电、空调停摆、UPS故障,总是让人心里慌慌,睡觉不踏实,更有时候会出现老鼠窜进去咬断网线之类的让人匪夷所思的事情,导致整个IT环境的不稳定。往往在这些不太起眼细节上的一个疏忽,会消耗掉管理维护人员的很多时间精力,甚至导致业务中断等故障。高斯数据库相比普通的数据库有什么优点?cid:link_1高性能:高斯数据库采用了自主设计的高性能存储引擎,具备快速的数据读写能力,能够处理大规模数据并发访问的场景。高可靠性:高斯数据库支持主备容灾机制,数据备份与恢复以及故障切换等功能,能够提供可靠的数据保护与高可用性。数据安全:高斯数据库采用了多层次的数据安全措施,包括权限管理、数据加密、审计日志等功能,保护数据的安全性和完整性。可扩展性:高斯数据库支持分布式架构,可以通过增加节点实现水平扩展,适应数据量和用户数的快速增长。数据库连接方面出现问题,目前还不知道如何解决,与delphi链接总是超时cid:link_2代码哪里写错了。我用python和java试过,链接完全没有问题交换数据空间EDS是如何实现可信、可控功能的?cid:link_3交换数据空间(Encrypted Data Space,EDS)是一种用于保护数据隐私的技术,它通过加密和分割数据,实现了可信和可控的功能。下面是关于EDS如何实现这些功能的一般原理:加密保护:EDS使用加密算法对数据进行加密,确保数据在传输和存储过程中的安全性。加密可以防止未经授权的访问者获取敏感信息,即使数据被盗或泄露,也无法直接访问其内容。数据分割:EDS将数据分割成多个部分,并将这些部分分散存储在不同的位置。这种分割和分散存储的方式可以减少数据泄露的风险,即使某个部分的数据被获取,也无法还原出完整的数据。访问控制:EDS采用访问控制机制来管理数据的访问权限。只有经过授权的用户或实体才能够解密和访问数据。这种控制机制可以确保只有合法的用户可以访问数据,提高了数据的可信度。审计和监控:EDS提供审计和监控功能,可以记录数据的访问记录和操作日志。这样可以对数据的使用情况进行监控和审计,发现异常行为或违规操作,并及时采取相应的措施。【鲲鹏服务器】【编译安装mysql】【openEuler】【openssl】编译安装mysql报错cid:link_4指定 OpenSSL 路径:如果已经安装了 OpenSSL,但编译过程仍然找不到相关库或头文件,可以通过指定 OpenSSL 的路径来解决。在运行 configure 脚本时,使用 --with-openssl= 参数指定 OpenSSL 路径。例如:./configure --with-openssl=/usr/local/openssl其中 是 OpenSSL 的安装路径。国产神通数据库ENCRYPT_ORA加密函数如何用Java代码实现cid:link_5Java Cryptography Architecture (JCA) 是一组 API,用于实现现代密码学的概念,例如数字签名、消息摘要、证书、加密、密钥生成和管理、安全随机数生成等。使用 JCA 开发人员可以通过以下方式构建他们的应用程序将安全性融入其中。要在您的应用程序中集成安全性,而不是依赖于复杂的安全算法,您可以轻松调用 JCA 中提供的相应 API 来获取所需的服务。创建分区表时,分区键需要是generated always的生成列,执行报错,请问oracle可以,到gaussDB的话,该如何处理?cid:link_6在GaussDB for openGauss中,分区表的分区键可以是generated always的生成列。然而,对于某些特定情况,由于openGauss版本的差异,可能会导致从Oracle迁移到openGauss时遇到一些兼容性问题。如果您在创建分区表时遇到了报错,请确保按照openGauss的语法和规范进行操作。以下是一些处理方法和注意事项:确认openGauss版本:不同版本的openGauss可能有略微不同的语法和支持特性。请确保您正在使用最新版本,并参考相应版本的文档。检查数据类型和语法差异:数据库系统之间存在数据类型和语法差异的情况,例如数据类型名称、函数用法等。在迁移过程中,请检查并调整相关代码以符合openGauss的语法规范。检查限制和约束:openGauss中有一些与分区表相关的限制和约束,例如每个分区表的最大分区数、生成列的限制等。请确保您的表定义符合这些限制。考虑手动处理:如果无法直接将Oracle的创建表语句转换为openGauss的语法,请考虑手动重建表结构并添加分区键。这样可以更好地适应openGauss的语法和规范要求。Gauss DB 查询数据库全量表的行信息问题cid:link_7use information_schema; select sum(table_rows) from tables where TABLE_SCHEMA = "test" order by table_rows asc;鲲鹏架构默认的char是有符号还是无符号呢?鲲鹏的问题有专门的渠道进行支持,欢迎到昇腾新论坛发帖进行求助~鲲鹏新论坛地址:cid:link_11解锁新论坛:在新论坛中发帖需要大家先注册账号,建议大家新账号的昵称与老账号一致哦!欢迎大家多多提问和分享技术干货,感谢大家支持和谅解。鲲鹏论坛迁移公告:cid:link_8大二电子信息工程专业在鲲鹏华为云数据库上有啥推荐的学习路径吗cid:link_9数据库学习路线,cid:link_10
  • [SQL] not in导致慢的一个优化案例
    问题背景测试环境后台开启log_min_duration_statement为3s抓取慢sql时(版本低没开topsql),突然发现后台日志有条sql语句执行了65s,业务sql语句一般执行时间很短,这个不正常,得拿出来看下了. 计划见下图-----(**表名,字段和值已自定义化**)排查思路从计划可以看出为明显的nested loop导致的慢 1.计划选择nested loop的原因为where后面的条件为not in 2.此计划慢的原因为not in里面的语句过滤后的数据量太大,且无法走索引(year条件过滤性太差吧,我怀疑表里面一半值都是这个)。解决方案:从上面分析可知慢的原因,就好下手去优化了。 首先去掉nested loop,改为hash join方式 以下为改下后的语句和计划从计划可以看到改写后的语句走的是hash join的方式,且总体执行代价从38万降到8万,执行时间也从65s下降到1s。问题思考:1.为啥数据库会选择nested loop计划 对于非等值条件数据库无法走hash join 2.是不是hash join一定比nest loop快? 对于被驱动表,如果存在索引的场景下,且整体过滤后的结果很少,走nested loop往往会优于hash join。 本问题语句被驱动表查询结果集很大,且无法走索引,因此nested loop计划就会很慢。
  • [问题求助] 大二电子信息工程专业在鲲鹏华为云数据库上有啥推荐的学习路径吗
    大二电子信息工程专业在鲲鹏华为云数据库上有啥推荐的学习路径吗
  • [问题求助] 高斯数据库相比普通的数据库有什么优点?
    高斯数据库相比普通的数据库有什么优点?
  • [技术干货] mybatis缓存之一级缓存
    mybatis缓存之一级缓存一级缓存的产生一级缓存的产生,并不是看mappper的xml文件的select方法,看下面的例子mapper.xml <select id="getById" resultType="entity.TempEntity"> select * from temp where id = #{id} </select>test @Test public void testSelectAsUpdate() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); sqlSession.update("dao.Temp03Dao.getById", 1); sqlSession.update("dao.Temp03Dao.getById", 1); }执行结果2020-06-26 17:33:27,899 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:33:27,922 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:33:27,923 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:33:27,923 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer)我们可以看到执行了2次查询。说明并没有产生缓存。说明和sqlsession调用的方法是有关系的只有调用上图中的方法才会产生一级缓存一级缓存的销毁1.关闭session这个是根据debug看到的一级缓存的最终结构。下面是整个依赖的类图test @Test public void test() throws IOException, NoSuchFieldException, IllegalAccessException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity1); Field executorField = sqlSession.getClass().getDeclaredField("executor"); executorField.setAccessible(true); CachingExecutor cachingExecutor = (CachingExecutor) executorField.get(sqlSession); Field declaredField = cachingExecutor.getClass().getDeclaredField("delegate"); declaredField.setAccessible(true); SimpleExecutor simpleExecutor = (SimpleExecutor) declaredField.get(cachingExecutor); Field localCacheField = simpleExecutor.getClass().getSuperclass().getDeclaredField("localCache"); localCacheField.setAccessible(true); PerpetualCache perpetualCache = (PerpetualCache) localCacheField.get(simpleExecutor); Field cacheField = perpetualCache.getClass().getDeclaredField("cache"); cacheField.setAccessible(true); Map<Object,Object> map= (Map<Object, Object>) cacheField.get(perpetualCache); logger.info("缓存关闭前"); for (Map.Entry<Object,Object> objectObjectEntry:map.entrySet()){ logger.info(objectObjectEntry.getKey() + "===" + objectObjectEntry.getValue()); } sqlSession.close(); logger.info("缓存关闭后"); for (Map.Entry<Object,Object> objectObjectEntry:map.entrySet()){ logger.info(objectObjectEntry.getKey() + "=" + objectObjectEntry.getValue()); } }运行结果2020-06-26 17:38:52,777 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:38:52,801 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:38:52,824 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:38:52,824 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:38:52,825 INFO [TempTest] - 缓存关闭前 2020-06-26 17:38:52,826 INFO [TempTest] - -1654591322:461730790:dao.Temp03Dao.getById:0:2147483647:select * from temp where id = ?:1:dev===[TempEntity{id=1, value1='11111', value2='aaaaa'}] 2020-06-26 17:38:52,827 INFO [TempTest] - 缓存关闭后可以看到session关闭后,缓存就不存在了2.Commit提交test @Test public void testCommit() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity1); sqlSession.commit(); TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity2); logger.info(tempEntity1 == tempEntity2); }运行结果2020-06-26 17:40:40,821 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:40:40,846 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:40:40,862 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:40:40,862 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:40:40,863 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:40:40,863 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:40:40,864 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:40:40,864 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:40:40,864 INFO [TempTest] - false说明sqlSession.commit时会清空缓存3.Rollbacktest @Test public void testRollback() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity1); sqlSession.rollback(); TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity2); logger.info(tempEntity1 == tempEntity2); }执行结果2020-06-26 17:42:23,793 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:42:23,833 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:42:23,843 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:42:23,843 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:42:23,844 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:42:23,844 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:42:23,845 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:42:23,845 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:42:23,845 INFO [TempTest] - falsesqlSession.rollback()也会清空缓存4.update更新这里是在第一次查询后,紧接着进行update操作。这里与表无关。就是操作其它表,也会清空缓存。test @Test public void testForUpdate() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity1); sqlSession.update("dao.Temp03Dao.updateById", 1); TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity2); logger.info(tempEntity1 == tempEntity2); }运行结果2020-06-26 17:45:43,997 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:45:44,034 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:45:44,048 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:45:44,049 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:45:44,049 DEBUG [dao.Temp03Dao.updateById] - ==> Preparing: update temp set value1 = 'ffffff' where id = ? 2020-06-26 17:45:44,049 DEBUG [dao.Temp03Dao.updateById] - ==> Parameters: 1(Integer) 2020-06-26 17:45:44,050 DEBUG [dao.Temp03Dao.updateById] - <== Updates: 1 2020-06-26 17:45:44,051 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:45:44,051 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:45:44,052 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:45:44,053 INFO [TempTest] - TempEntity{id=1, value1='ffffff', value2='aaaaa'} 2020-06-26 17:45:44,053 INFO [TempTest] - false这里还是在一个session会话中。记得之前有人给我说只要在一个session会话中,执行update不会清空缓存。这里的代码就证明了5.clearCache 主动清除test @Test public void testClearCatch() throws IOException { InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = build.openSession(); TempEntity tempEntity1 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity1); sqlSession.clearCache(); TempEntity tempEntity2 = sqlSession.selectOne("dao.Temp03Dao.getById", 1); logger.info(tempEntity2); logger.info(tempEntity1 == tempEntity2); }运行结果2020-06-26 17:48:42,085 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:48:42,110 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:48:42,124 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:48:42,124 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:48:42,125 DEBUG [dao.Temp03Dao.getById] - ==> Preparing: select * from temp where id = ? 2020-06-26 17:48:42,125 DEBUG [dao.Temp03Dao.getById] - ==> Parameters: 1(Integer) 2020-06-26 17:48:42,126 DEBUG [dao.Temp03Dao.getById] - <== Total: 1 2020-06-26 17:48:42,126 INFO [TempTest] - TempEntity{id=1, value1='11111', value2='aaaaa'} 2020-06-26 17:48:42,126 INFO [TempTest] - false一级缓存 脏读问题
  • [问题求助] 鲲鹏架构默认的char是有符号还是无符号呢?
    鲲鹏架构默认的char是有符号还是无符号呢?
  • [问题求助] 华为418您的请求疑似攻击行为!
    怎样前往WAF控制台进行误报屏蔽设置?
  • [问题求助] 交换数据空间EDS是如何实现可信、可控功能的?
    交换数据空间EDS是如何实现可信、可控功能的?
  • [问题求助] EDS有哪些应用场景?
    EDS有哪些应用场景?有哪些优势?
  • [其他] 数据库板块2023.9月集合
     GaussDB用途特性,与其他数据库的异同? https://bbs.huaweicloud.com/forum/thread-0222129456565429281-1-1.htmlDTCC 2023专家解读丨GaussDB技术解读系列之数据库迁移创新实践https://bbs.huaweicloud.com/forum/thread-0246129349018228207-1-1.htmlGaussDB数据库SQL系列-表连接(JOIN)https://bbs.huaweicloud.com/forum/thread-0224128872778951555-1-1.htmlDTCC 2023专家解读 | GaussDB技术解读系列之性能调优https://bbs.huaweicloud.com/forum/thread-0299128917040068669-1-1.html如何提高单测覆盖率介绍https://bbs.huaweicloud.com/forum/thread-0249130843551639008-1-1.html idea的远程调试https://bbs.huaweicloud.com/forum/thread-0201130844150680015-1-1.html h2数据库在单元测试中的作用和如何使用https://bbs.huaweicloud.com/forum/thread-0201130846287046016-1-1.html java中使用h2数据库https://bbs.huaweicloud.com/forum/thread-0279130846188058018-1-1.html
总条数:323 到第
上滑加载中