什么是从Oracle数据库获取大量数据到Java对象的最快方法

时间:2012-02-16 07:22:05

标签: java performance oracle

从Oracle数据库获取大量数据到Java对象的最快方法是什么。

是否有关于数据组织方式的Oracle技巧?

我在考虑使用普通的JDBC而不是任何Hibernate样式库?

让Oracle生成一个文件然后从文件中读取会不会更好 - 尽管这必须以编程方式完成。

所有的想法都很受欢迎。

3 个答案:

答案 0 :(得分:4)

我不是Java或JDBC专家,但如果您计划从数据库中删除大量行,则可能会通过增加连接上的预取行来获益。

Connection conn = DriverManager.getConnection ("jdbc:oracle:","user","password"); 

//Set the default row prefetch setting for this connection 
((OracleConnection)conn).setDefaultRowPrefetch(100); 

我认为JDBC的默认设置是一次获取一行,因此您需要为每个提取的行支付往返数据库的费用。 (注意,我已经看到文档表明默认是每次往返10行)。将预取设置为更大的数字将在每次往返数据库时获取更多行。根据行数和网络性能,速度的提升可能会非常显着。

答案 1 :(得分:1)

根据您想要使用的内容,我想要删除jdbc并使用Oracle Call API编写与数据库位于同一台计算机上的自定义应用程序,JNI将是最快的...

使用JDBC使用简单准备好的声明可能要简单得多,如果这还不够(并且取决于瓶颈的位置),请尝试制作存储过程。像Hibernate这样的ORM完成的缓存不应该打折,所以我想你必须做一些基准测试。此外,如果瓶颈是数据库并且您编写了一个提高读取性能的存储过程,那么您仍然可以使用Hibernate将数据封送到java对象。见Using stored procedures for querying

答案 2 :(得分:1)

无论你做什么,设计/实现“延迟初始化”[实际上只适用于复杂的对象层次结构/网络;你说java对象(复数)所以我想象的不仅仅是一个映射到单个对象的表]。所以基本上,你只是阅读那时所需的对象;当你运行一个getter方法时,它会对这些数据进行更多的db调用。

Java世界中有时会忽略的另一个技巧是:如果你有一些来自代码的复杂sql,你可以在Oracle端创建一个视图,在那里嵌入那个复杂性,然后将你的对象映射到视图;所以,如果你可以像观点那样展平你的对象,那么你就是在做生意。