导航

公墓网

当前位置: 首页 > 公墓资讯

preparecall、preparecall方法

更新时间:2025 08 02 20:56:46 作者 :庆美网 围观 : 69次

欲速则不达,欲达则欲速!

hibernate让你不用写sql了,这不单可以让你的应用更好移植其它数据库,更主要的是让程序员更专注业务逻辑、数据关系、对象关系等。hibernate对一对多,多对多关系实现是非常好的。很关键一点,它支持lazy,可以让你的数据只在需要的时候被加载,听起来很完美。hibernate还有一个更牛的就是HQL,这是完全可以把查询映射到你OO模型的查询语言,和mybatis的映射比起来,还是更方便和更强大的。

1、@Lazy注解是什么?

@Lazy注解用于标识bean是否需要延迟加载,源码如下:

preparecall、preparecall方法

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Lazy { /** * Whether lazy initialization should occur. */ boolean value() default true; }

只有一个参数,默认是true,也就是说只要加了这个注解就会延迟加载。

2、@Lazy注解怎么使用

没加注解之前主要容器启动就会实例化bean,如下:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);

创建user实例

而加上@Lazy注解则必须在第一次调用的时候才会加载如下:

@Scope @Lazy @Bean(value=\”user0\”,name=\”user0\”,initMethod=\”initUser\”,destroyMethod=\”destroyUser\”) public User getUser(){ System.out.println(\”创建user实例\”); return new User(\”张三\”,26); }AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class); User bean2 = applicationContext2.getBean(User.class);创建user实例 实例1 === User [userName=张三, age=26]

@Lazy注解注解的作用主要是减少springIOC容器启动的加载时间

二、hibernate劣势

看完优势之后,感觉hibernate无所不能了,无敌是多么的寂寞。处理大量数据或者大并发情况的网络服务感觉不是很好用,那么现在开始说说hibernate的问题。

1、难以使用数据库的一些功能

hibernate将数据库与开发者隔离了,开发者不需要关注数据库是Oracle还是MySQL,hibernate来帮你生成查询的sql语句,但问题来了,如果你想用某种数据库特有的功能,或者要让查询的sql完全符合你的心意,这就难了。如果使用hibernate,虽然它能对生成的查询进行一定程序的定制,但就有点隔靴挠痒的感觉了,而且你开发起来付出的代价更大。至于hibernate对native sql的支持,还是挺完善的,这种native sql还能返回non-managed entity,不走hibernate的cache,优化是搞定了,但如果整个项目都这么整,那还是用mybatis吧。

很多时候,我们都有一个需求:得到数据库服务器的当前时间。这是因为本机时间和服务器时间是有差别的。各种数据库都提供了函数来获得,比如,mysql,可以用“select now()”。hibernate也提供了一个函数current_timestamp(说起timestamp,个人认为数据库的timestamp做的很差,它居然和datetime是一个数量级的(精确度),这怎么可以用来表示真正的stamp啊!)。可是,你却无法用直接使用“select current_timestamp()”来获得服务器的当前时间,你还必须加上一个查询的表!比如,“select current_timestamp() from tbl_Good”。个人十分郁闷,我只是想用这个简单功能而已,为什么我一定要知道数据库里面的表格呢????更何况还必须建立映射。。。。。。不是我不明白,这世界太复杂了 。每样产品都是拼命的复杂化,其实,它们实在是忽略了一般的用户只需要一小部分功能而已。默认的功能应该是能够满足普通用户的常见需求的,那样才算是一个好的产品。我不认为hibernate做到了这点。

2、满足不了程序对cache的需求

很多web服务,对cache的依赖是非常大的,hibernate自带的cache按理说也是很强大的,但还是满足不了很多需求。

3、耦合度高

hibernate的确是在你项目开发的时候节约了很多时间,但是它对你的业务逻辑模型和数据库模型互相依赖的程度太高了。短期没啥问题,但随着项目的变迁,这些都会改变,在维持这种仅仅耦合的关系的时候,你会发现你的代码特别脆弱,随便改一处数据库的schema,整个java项目可能要改几十次。而且现在mybatis的自动mapping做的也很好,开发起来也没花多长时间,等项目进入中后期,你需要大量定制和优化查询的时候,mybatis的开发效率就更明显了。

4、debug难

作为一个后端程序员,我比较喜欢每一行代码我都精确知道它到底在干什么。尤其是数据库访问的代码,往往系统的瓶颈就在这些地方产生,每一行都不能小看。我看过hibernate早期版本的部分代码,比我想象的复杂和强大很多。的确很多地方Hibernate可以强大的只用一行代码解决很多问题,但比如说一个update()或者save()到底做了什么,这里既有hibernate本身的逻辑,也有你应用的逻辑,如果这一行产生了问题,你该如何去做?我个人觉得这是很难搞的,还不如一开始费点事,用mybatis这种。

作为一个程序员,我始终坚持认为改代码比改配置文件容易。

5、hibernate更新大批量数据

(1)hibernate批量更新customers表中大于零的所有记录的age字段:

如果customers表中有一万条年龄大于零的记录,那么session的find()方法会一下子加载一万个customer对象到内存中。当执行tx.commit()方法时,会清理缓存,hibernate执行一万条更新customers表的update语句:

(2)以上hibernate批量更新方式有两个缺点

  • 占用大量内存空间,必须把一万个customer对象先加载到内存,然后一一更新他们。
  • 执行的update语句的数目太多,每个update语句只能更新一个Customer对象,必须通过1万条update语句才能更新一万个Customer对象,频繁的访问数据库,会大大降低应用的性能。

(3)为了迅速释放1万个Customer对象占用的内存,可以在更新每个Customer对象后,就调用Session的evict()方法立即释放它的内存:

在以上程序中,修改了一个Customer对象的age属性后,就立即调用Session的flush()方法和evict()方法,flush()方法使hibernate立刻根据这个Customer对象的状态变化同步更新数据库,从而立即执行相关的update()语句;evict()方法用于把这个Customer对象从缓存中清除出去,从而及时释放它占用的内存。

但evict()方法只能稍微提高批量操作的性能,因为不管有没有使用evict()方法,Hibernate都必须执行1万条update语句,才能更新1万个Customer对象,这是影响批量操作性能的重要因素。假如Hibernate能直接执行如下SQL语句:

那么以上一条update语句就能更新CUSTOMERS表中的1万条记录。但是Hibernate并没有直接提供执行这种update语句的接口。应用程序必须绕过Hibernate API,直接通过JDBC API来执行该SQL语句:

以上程序演示了绕过Hibernate API,直接通过JDBC API访问数据库的过程。应用程序通过Session的connection()方法获得该Session使用的数据库连接,然后通过它创建 PreparedStatement对象并执行SQL语句。值得注意的是,应用程序仍然通过Hibernate的Transaction接口来声明事务边 界。 如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行Hibernate批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateCustomer()的存储过程,代码如下:

以上存储过程有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:

从上面程序看出,应用程序也必须绕过Hibernate API,直接通过JDBC API来调用存储过程。

6、hibernate删除大批量数据

Session的各种重载形式的update()方法都一次只能更新一个对象,而delete()方法的有些重载形式允许以HQL语句作为参数,例如:

如果CUSTOMERS表中有1万条年龄大于零的记录,那么以上代码能删除一万条记录。但是Session的delete()方法并没有执行以下delete语句

Session的delete()方法先通过以下select语句把1万个Customer对象加载到内存中:

接下来执行一万条delete语句,逐个删除Customer对象:

由 此可见,直接通过Hibernate API进行Hibernate批量更新和Hibernate批量删除都不值得推荐。而直接通过JDBC API执行相关的SQL语句或调用存储过程,是hibernate批量更新和批量删除的最佳方式。

素小暖讲Spring JdbcTemplate

三、群众的眼光的雪亮的,千万不要逆天而行

四、被喷之后的一些感悟

感觉就是一场批斗大会,我深深的感觉到才疏学浅的无奈,我真的只是想好好学习而已,希望若干年后,我还能初心不改。

作为一个初级程序员而言,没有必要花费过多的时间去证明技术的无用论,我并没有对hibernate这个框架进行深入的研究,只是在肤浅的层面的一些个人感悟。

框架本身并没有对错一说,只有适合不适合,任何框架都有其自身的能力范围,hibernate封装了很多有用的API给我们,降低了操作数据库的难度和复杂度,同时也减少了模板代码的数量,但hibernate留给开发者的可操作空间相对mybatis少了很多;mybatis框架使用起来更加灵活,开发者可以自定义查询语句,但增加了模板代码量,看起来并没有hibernate边界。两种框架在便捷与灵活两个指标上做出了取舍和妥协,这不能说是框架的错。对于一个框架而言,需要有自身专注的领域和设计愿景,不可能面面俱到,就如这位大哥所言:

使用任何一种技术框架,都需要贴合现实的业务需求以及自身的技术能力。当你还没有深入的去了解一门技术或者当前业务需求无法与框架契合时,不要盲目的批判框架的好坏。

https://my.oschina.net/u/4006148/blog/3157757

java servlet调用带有多个返回结果集的存储过程

一、mysql存储过程

这里我先说下我这个功能实现的逻辑及途中遇到的一些问题。这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可)。实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集。我这里当然是为了实现这个效果,所以把它的实现复杂化了。继续说下我今天在mysql上遇到的一个问题,究竟是什么原因,其实我现在也没弄清楚,写这个存储过程前,我给要查询的表中增加了两个字段,然后修改了一个字段的名称,增加的字段到没有任何影响,但是修改过名称的字段就出问题了,在java中调用这个存储过程时,就提示这个字段不存在。之后我将这个修改过的字段再修改回去就好了,下面贴存储过程代码。

1、参数

in sheetOneAccount varchar(50),in sheetTwoAccount varchar(50)

2、代码

一、java Servlet

1、调用存储过程方法

2、调用

3、实现截图

由于本人也是才开始学java,如有不合理之处,请及时指出。

多维分析后台实践 1:基础宽表

【摘要】用实例、分步骤,详细讲解多维分析(OLAP)基础宽表的实现。点击了解多维分析后台实践 1:基础宽表

本期目标是练习如何搭建多维分析后台的基础宽表,并通过 SPL 和 SQL 访问基础宽表。

实践的步骤:

1、 准备基础宽表:将基础宽表数据从数据库中取出,存成组表文件。

2、 访问基础宽表:用 SPL 或者 SQL 语句访问。

本期样例宽表为 customer 表。从 Oracle 数据库中取出宽表数据的 SQL 语句是 select * from customer。执行结果如下图:

其中字段包括:

CUSTOMER_ID NUMBER(10,0), 客户编号

FIRST_NAME VARCHAR2(20), 名

LAST_NAME VARCHAR2(25), 姓

PHONE_NUMBER VARCHAR2(20), 电话号码

BEGIN_DATE DATE, 开户日期

JOB_ID VARCHAR2(10), 职业编号

JOB_TITLE VARCHAR2(32), 职业名称

BALANCE NUMBER(8,2), 余额

EMPLOYEE_ID NUMBER(4,0), 开户雇员编号

DEPARTMENT_ID NUMBER(4,0), 分支机构编号

DEPARTMENT_NAME VARCHAR2(32), 分支结构名称

FLAG1 CHAR(1), 标记 1

FLAG2 CHAR(1), 标记 2

FLAG3 CHAR(1), 标记 3

FLAG4 CHAR(1), 标记 4

FLAG5 CHAR(1), 标记 5

FLAG6 CHAR(1), 标记 6

FLAG7 CHAR(1), 标记 7

FLAG8 CHAR(1), 标记 8

多维分析计算的目标可以用下面的 SQL 语句表示:

select department_id,job_id,begin_date,sum(balance) sum,count(customer_id) count

from customer

where department_id in (10,20,50,60,70,80) and flag1=\’1\’ and flag8=\’1\’

group by department_id,job_id,begin_date

编写 etl.dfx,从数据库中取出数据生成组表文件 customer.ctx,即存储为宽表。代码示例如下:

A1:连接预先配置好的数据库 oracle。@l 选项是将字段名处理成小写,l 是字母 L 的小写,不是数字 1。

B1:建立数据库游标,准备取出 customer 表的数据。customer 是事实表,实际应用中一般都比较大,所以用游标的方式,避免内存溢出。

A2:定义列存组表文件。字段名和 B1 完全一致。

A3:边取出游标 B1,边输出到组表文件中。

B3:关闭组表文件和数据库连接。

当宽表数据量有一千万行时,导出组表文件约 393MB。

按照教程部署好集算器节点机。将 meta.txt 放入主目录中,文件内容是表名和文件名的对应关系,如下:

Table File Column Type

customer data/customer.ctx

文件名是相对于主目录的,假如节点机主目录是 d:/esproc/,那么完整的文件名就是 d:/esproc/data/customer.ctx。

多维分析后台需要被通用的前端所调用。调用的方式有两种,第一种是使用 SQL;第二种是执行脚本,提交过滤条件、分组字段等参数给后台执行。

一、SQL

我们先来看第一种,以 Java 调用集算器 JDBC 为例来说明。Java 示例代码如下:

public void testOlapServer(){

Connection con = null;

java.sql.Statement st;

try{

// 建立连接

Class.forName(\”com.esproc.jdbc.InternalDriver\”);

// 根据 url 获取连接

con= DriverManager.getConnection(\”jdbc:esproc:local://?onlyServer=true&sqlfirst=plus\”);

st = con.createStatement();

// 直接执行 SQL+ 语句,获取结果集

ResultSet rs = st.executeQuery(\”select department_id,job_num,begin_date,sum(balance) sum,count(customer_id) count from customer where department_id in (10,20,50,60,70,80) and flag1=\’1\’and flag8=\’1\’group by department_id,job_num,begin_date\”);

// 继续处理结果集,将结果集展现出来

}

catch(Exception e){

out.println(e);

}

finally{

// 关闭连接

if (con!=null) {

try {con.close();}

catch(Exception e) {out.println(e); }

}

}

}

这里的 customer.ctx 会被完全读入内存,不适合大数据量的情况。对于大数据量,可以在表名前面加 /*+ external*/,组表会被处理成游标。或者也可以采用下面执行脚本的方法。

加上 /*+ external*/ 之后的 SQL 如下:

select department_id,job_num,begin_date,sum(balance) sum,count(customer_id) count

from /*+ external*/ customer

where department_id in (10,20,50,60,70,80) and flag1=\’1\’ and flag8=\’1\’

group by department_id,job_num,begin_date

用游标时,Java 程序执行的总时间是 8 秒。

需要说明的是,这里的执行时间绝对数值并不重要(它和硬件环境相关)。记录执行时间是为了后面的实践中采用多种优化方法时,看看可以将时间缩短多少。

我们可以用多线程并行的方式执行 SQL,方法是给表名加上/*+parallel (n) */。2 线程并行完整的 SQL 如下:

select department_id,job_num,begin_date,sum(balance) sum,count(customer_id) count

from /*+ external*/ /*+parallel (2) */ customer

where department_id in (10,20,50,60,70,80) and flag1=\’1\’ and flag8=\’1\’

group by department_id,job_num,begin_date

2 线程并行时,Java 程序执行的总时间是 4 秒。

二、执行脚本

编写 olap-spl.dfx,用 SPL 代码访问宽表并进行过滤和分组汇总计算。

先定义网格参数,将文件名、过滤条件、分组字段、聚合表达式分别传入。

参数设置窗口如下:

参数值设置如下:

filename=\”data/customer.ctx\”

where=\”[10,20,50,60,70,80].contain(department_id) && flag1==\\\”1\\\”&& flag8==\\\”1\\\”

group=\”department_id,job_id,begin_date\”

aggregate=\”sum(balance):sum,count(customer_id):count\”

SPL 代码示例如下:

A1:打开组表对象。

B1:建立游标,定义游标前过滤,条件是 where 变量的值。

A2:对游标做分组汇总计算,分组字段是 group 变量的值。汇总计算是 aggregate 变量的值。因为分组之后数据量较小,所以用 groups,结果集直接放在内存中。

执行结果如下图:

A3:将结果集返回给调用者。

olap-spl.dfx 编写好之后,可以在多维分析中作为存储过程调用,Java 代码如下:

public void testOlapServer(){

Connection con = null;

java.sql.PreparedStatement st;

try{

// 建立连接

Class.forName(\”com.esproc.jdbc.InternalDriver\”);

// 根据 url 获取连接

con= DriverManager.getConnection(\”jdbc:esproc:local://?onlyServer=true&sqlfirst=plus\”);

// 调用存储过程,其中 olap-spl 是 dfx 的文件名

st =con.prepareCall(\”call olap-spl(?,?,?,?)\”);

st.setObject(1, \”data/customer.ctx\”);

st.setObject(2, \”[10,20,50,60,70,80].contain(department_id) && flag1==\\\”1\\\”&& flag8==\\\”1\\\” \”);

st.setObject(3, \”department_id,job_id,begin_date\”);

st.setObject(4, \”sum(balance):sum,count(customer_id):count\”);

// 执行存储过程

st.execute();

// 获取结果集

ResultSet rs = st.getResultSet();

// 继续处理结果集,将结果集展现出来

}

catch(Exception e){

out.println(e);

}

finally{

// 关闭连接

if (con!=null) {

try {con.close();}

catch(Exception e) {out.println(e); }

}

}

}

此时,我们是采用单线程进行的计算。

单线程时,Java 程序执行的总时间是 12 秒。

我们也可以用多线程并行的方式执行脚本。2 线程并行的 olap-spl.dfx 脚本如下:

B1:cursor 函数的 @m 是指多路游标,最后一个参数 2 表示 2 路,也就是 2 线程并行。

2 线程时,Java 程序执行的总时间是 6 秒。

preparecall、preparecall方法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、preparecall、preparecall方法的信息别忘了在本站进行查找哦。

用户评论

虚伪了的真心

感觉这个 preparecall 方法好强大! 直接将电话号码和一些需要的参数打包进去,就能完成拨打电话的操作了,太省事了!我现在在开发一个 app,需要频繁地进行电话交互,这个方法简直就是福音啊!

    有11位网友表示赞同!

晨与橙与城

准备去学习一下这个 preparecall 方法的使用方法。 看来我的 Android 开发技巧又可以提升一把了。

    有20位网友表示赞同!

心悸╰つ

这篇博客写的真好,解释很清晰简洁!我之前总是在手机上拨打电话的时候手动输入号码,感觉太麻烦了,现在终于找到解决方案啦!

    有19位网友表示赞同!

你瞒我瞒

准备电话功能真挺有用的,尤其是在某些特定的场景下,比如你需要快速联系客户或处理紧急事宜时,这种高效的通话方式的确会节省不少时间和精力!就想知道这个 preparecall 方法除了拨打电话以外,还能做些什么呢?

    有6位网友表示赞同!

迷路的男人

说实话,我对这种 preparecall 方法不太了解。我主要还是专注于 Android 的 UI 开发,对于底层编程方面的知识积累不足 ,希望能有更多资源可以帮助我学习这个方面的东西。

    有8位网友表示赞同!

♂你那刺眼的温柔

感觉这种准备电话的方法非常方便,可以让代码更加简洁明了! 不过我想知道这个方法在安全性方面如何保证?万一有人恶意篡改参数怎么办?

    有9位网友表示赞同!

玩味

使用 preparecall 方法拨打电话真的比传统的方式高效很多。我在之前的项目中就遇到了类似的需求,如果早点知道了这个方法就好了!

    有10位网友表示赞同!

服从

我觉得 preparecall 方法非常适合用于一些需要快速连接用户的应用场景,比如远程客服系统、实时沟通平台等等。 这种方式可以有效缩短用户等待时间,提升用户体验。

    有14位网友表示赞同!

西瓜贩子

学习了一些关于 preparecall 方法的信息,觉得这是一个很酷的Android 开发工具!我打算在接下来的项目中尝试使用一下,看看它能否帮助我优化程序的性能和效率。

    有15位网友表示赞同!

温柔腔

这个 preparecall 方法确实很有用,尤其是在一些需要频繁拨打电话的场景下。 不过我想知道这个方法在不同 Android 版本上是否兼容性良好? 这一点对于我来说很重要!

    有16位网友表示赞同!

未来未必来

这篇文章让我对preparecall 方法有了初步的了解。感觉这个工具可以提高开发效率,方便很多操作。 我打算先去看看相关的API文档,再尝试实现一下。

    有9位网友表示赞同!

風景綫つ

preparecall 方法听起来很不错,能简化拨打电话流程,提升 App 的用户体验!我正在开发一个需要频繁联繫客户的 App,这个方法似乎很合适,我要认真学习一下...

    有18位网友表示赞同!

|赤;焰﹏゛

这篇博客讲得真好 !! 我以前总是手工拨通电话,太麻烦了 ,有了 preparecall 方法真方便啊!

    有10位网友表示赞同!

麝香味

我一直在寻找一些提高 Android 应用开发效率的方法,准备看看这个 preparecall 方法会不会有所帮助。期待能够提升我的开发速度和体验!

    有14位网友表示赞同!

呆檬

感觉这 preparecall 方法有些复杂,作为一个初学者,还没有足够的经验来理解它。希望以后能看到更具体的教程或案例分析,这样可以更容易地学习到它的使用方法。

    有12位网友表示赞同!

入骨相思

这个博客分享的知识点很棒,让我对 Android 开发有了更深入的了解! preparecall 方法真的很有潜力,希望能看到更多开发者运用这种方法开发出更加优质的应用软件

    有17位网友表示赞同!

花菲

这篇文章让我对preparecall方法有了初步了解!我觉得这个方法很有潜力,可以帮助开发者简化代码并提升开发效率

    有9位网友表示赞同!

标签: 公墓资讯
相关资讯
  • 哪些连锁店是大型母婴连锁店?

    母婴连锁店是现在许多准父母和准妈妈们必不可少的购物地点,它们提供着各种各样的产品和服务,为孕婴消费者带来便利。但是,你知道什么样的连锁店才能称得上是大型母婴连锁店吗?今

    2025-08-02 18:57:31 公墓资讯 
  • 哪些连锁店是全国十大知名孕婴店?

    小伙伴们,近年来,孕婴店行业发展迅速,各大连锁店也是层出不穷。但是你知道吗?在这么多的孕婴店中,哪些才是全国十大知名的呢?今天就让我来为你揭晓吧!首先,我们会介绍什么是孕婴店以

    2025-08-02 18:53:31 公墓资讯 
  • 哪些连锁店是全国十大母婴连锁店?有什么特点?

    全国十大母婴连锁店,这个标题是否让你心动?母婴行业一直备受关注,而连锁店更是备受消费者青睐。那么,哪些连锁店能够脱颖而出,成为全国十大母婴连锁店?它们有什么特点?让我们一起来

    2025-08-02 18:42:30 公墓资讯 
  • 哪些连锁孕婴店在全国排名靠前?

    嘿,亲爱的小伙伴们,今天我们要来聊一聊生活百科行业的热门话题:哪些连锁孕婴店在全国排名靠前?是不是有些宝妈们已经迫不及待想知道答案了?别急,让我先来带你们了解一下这个行业的

    2025-08-02 18:37:31 公墓资讯 
  • 哪些进口羊奶粉品牌受欢迎?排行榜前十名有哪些?

    嘿,亲爱的小伙伴们!最近有没有发现身边越来越多的人选择给宝宝喝进口羊奶粉?是不是觉得很好奇,为什么进口羊奶粉这么受欢迎呢?今天就让我来给大家揭开这个秘密!首先,我们会先介绍一

    2025-08-02 18:33:31 公墓资讯 
  • 哪些进口羊奶粉品牌入选排行榜前10强?

    大家好!今天要来聊一聊生活百科行业里备受关注的话题——进口羊奶粉。近年来,随着人们健康意识的提升,越来越多的消费者开始关注起了羊奶粉这种新兴产品。但是,你知道什么是羊奶

    2025-08-02 18:25:30 公墓资讯