kodojdo指南第八章

第八章 PersistenceManager

  上图概括了PersistenceManager 接口最常用的方法和属性。参考Javadoc了解更完整的信息。类JAVA

BEAN风格的getter和setter方法在字段声明时给出。入参为....的方法表示重载函数。
  PersistenceManager 是应用程序和JDO运行时结合的主要接口。每个PersistenceManager 管理一个持

久事务对象的缓存,并关联一个单一的事务。
  按照功能,PersistenceManager 的方法可以如下分类:
  1)关联用户对象
  2)属性配置
  3)关联事务
  4)能持久生存期管理
  5)JDO标识管理
  6)查询工厂
  7)扩展工厂
  8)关闭


8。1 关联用户对象
 
  PersistenceManager的UserObject 属性允许你将任意一个对象和一个PersistenceManager关联。这

个对象不能是JDO实现品使用的对象。

8.2. 属性配置
 
  PersistenceManager 包括两个配置属性的getter和setter方法。分别是Multithreaded 和

IgnoreCache. 这些属性在PersistenceManagerFactory 设置一节里已经详细讨论过了。

8。3 关联事务

  PersistenceManager 和事务实例有着一对一的关系。事实上,许多厂商用单一的类来实现

PersistenceManager 和Transaction 接口。如果你的程序要求并发事务,你必须使用多重的

PersistenceManagers.
  你可以使用currentTransaction方法来取得当前PersistenceManager 所关联的事务。

8。4 能持久生存期管理

  PersistenceManagers 执行许多影响能持久类生存期实例状态的动作。这点通过提供多个函数来表现。例

如,可以将某个能持久对象作为参数,例如makePersistent方法, 也可以将整个能持久类的数组或集合作为

参数。例如makePersistentAll方法

  1)由暂时性转化为新持久状态。这个行为只能在活动事务的上下文环境中使用。事务提交之后,新的持久

实例会插入到数据库。

  2)这个行为使持久实例向暂时性状态转化。这个实例马上失去关联的PersistenceManager 和JDO标识。

但在数据库中的记录不会被修改。
  这个行为只能在clean对象上执行。如果在dirty对象执行,会抛出JDOUserException

  3)用这个方法使暂时性对象变为transient-transactional状态,或者持久非事务的对象进入当前事务

。在第二种情况下,这个行为必须在活动事务中执行。

  4)收回对象意味着告诉PersistenceManager你不再使用这个对象。对象的状态会变为hollow且

PersistenceManager 释放所有对该对象的强引用,允许它被垃圾回收。
  调用evictAll 方法表示收回所有在PersistenceManager缓存中处于persistent-clean状态的对象

  5)使用refresh 行为确保对象的持久状态和数据库中的值同步。这个行为的用意是避免长时间运行的优化

事务发生数据陈旧的危险。
  refreshAll 方法针对所有缓存中的事务性对象。如果没有活动的事务,这个方法没有意义。

  6)某个持久对象从数据库中取出所有持久字段,用这个方法取得该对象。用这个行为确保在状态转为暂时

性之前所有实例的字段完全被装载。注意,这个行为并不是递归的。假如对象A和B有关系,那么以A作为参数

调用retrieve 方法会装载B,会不必要地以数据库中的值填充B的字段。


8。5 生存期例子

8。6 JDO标识管理

  每个PersistenceManager都在缓存中管理持久对象的JDO标识。方法如下:

  1)返回能持久类的JDO标识类

  2)用JDO标识对象的toString方法返回的字符串重新创建JDO标识对象。假设一个能持久类和它的JDO标识

字符串,这个方法使用上述的getObjectById方法构造一个JDO标识对象,这个对象首先创建一个字符串,然

后根据这个字符串取得持久类对象。
  3)返回PersistenceManager 管理的能持久类的JDO标识
 

  4)返回JDO标识对象的相应持久类实例。如果实例已经缓存,会返回缓存里的版本。否则会创建一个新的实

例。是否从数据库中装载数据则不一定。
  如果方法的参数为true,当前JDO标识在数据库中的记录不存在,那么JDO会抛出

JDODataStoreException。否则,JDO会返回一个未验证是否被其他持久管理者删除的已缓存的实例。一些

JDO实现品在没有缓存对象存在时会返回一个hollow实例。如果你访问这个对象的持久字段不会抛出异常。

8。7 Extent工厂

  扩展是所有能持久类的能持久实例的逻辑体现,包括子类在内。
  使用 PersistenceManager 的getExtent  方法可以取得扩展。有两个参数:扩展 包含的对象的类,和

一个提示是否包括子类的布尔类型的参数
  假如能持久类在元数据里的requires-extent属性设置为false,那么你不能得到该类的扩展。
 
8。8 查询工厂
  查询对象用来查找符合某些条件的持久化对象。你可以通过PersistenceManager的newQuery得到查询实

例。参考查询章节和Javadoc可以获得更详细信息。

8.9  关闭

  当不再需要PersistenceManager的时候,你应该调用它的close方法。

### Hive 大数据性能调优最佳实践 #### 一、配置优化 对于云服务器上的Hive大数据环境,合理的资源配置至关重要。调整JVM参数可以有效提升查询效率[^1]。 ```bash set mapreduce.map.memory.mb=4096; set mapreduce.reduce.memory.mb=8192; ``` 适当增加Map和Reduce阶段内存分配有助于减少溢写磁盘次数,从而加快执行速度。 #### 二、表结构设计 采用分区(partitioning)与分桶(bucketing),可显著降低扫描范围并提高读取速率。通过预定义的数据分布模式来组织存储文件,使得特定条件下的过滤操作更加高效[^2]。 ```sql CREATE TABLE sales ( order_id STRING, customer_name STRING, amount DOUBLE ) PARTITIONED BY (year INT, month INT); ``` 此命令创建了一个按年份和月份划分的销售记录表格实例。 #### 三、查询语句改写 利用子查询因子化(subquery factoring)以及谓词下推(predicate pushdown)特性,在不影响逻辑的前提下重构SQL表达式,以便更好地发挥引擎内部优化器的作用[^3]。 ```sql WITH filtered_sales AS ( SELECT * FROM sales WHERE year >= 2020 AND year <= 2022 ) SELECT COUNT(*) FROM filtered_sales fs JOIN customers c ON fs.customer_name = c.name; ``` 上述例子展示了如何先筛选出目标时间段内的交易记录再与其他表关联计算总数的过程。 #### 四、启用ORC/Parquet格式 相较于传统的TextFile或SequenceFile格式而言,列式存储方式如ORC(optimized row columnar)或者Parquet能够提供更紧凑的空间占用率及更快捷的访问路径[^4]。 ```sql ALTER TABLE my_table SET FILEFORMAT ORC; INSERT OVERWRITE TABLE my_table SELECT * FROM old_format_table; ``` 这段脚本说明了怎样转换现有表至新的压缩编码形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值