我使用带有“ojdbc.jar”作为客户端的Java有一些奇怪的行为。
我有一个简单的程序,尝试使用一个查询插入500行。 (INSERT ALL FROM dual)。
这个程序需要25秒才能完成Java。这是statement.execute()方法完成所需的时间。
Wen我从SQLplus / SQLdeveloper运行查询时间不到1秒。
有什么想法吗?
答案 0 :(得分:1)
听起来你正在为每个插页获得一个新的连接。
答案 1 :(得分:0)
虽然您的性能问题似乎过多且超出了应该引起的性能问题,但值得注意的是Java JDBC-ODBC驱动程序的速度非常慢。如果可能,请使用数据库的本机驱动程序,因为它们通常会更快。
答案 2 :(得分:0)
通常,您可能希望避免使用非常大的SQL语句,尤其是INSERT ALL FROM DUAL技巧。我不知道为什么,但我已经看到了Oracle需要很长时间才能解析大型SQL语句的几种情况。出于某种原因“插入table_name(从双联盟中选择'asdf',所有选择'asdf来自双...)”似乎工作得更好,但它在一段时间后仍然开始减速。
我曾经计算过不同大小的类似查询,并且解析时间似乎在某个时候呈指数级增长。那是在10.2.0.3.0我相信。但我现在无法在10.2.0.1.0上重现这个问题,也许这只是某个特定版本的错误?
我建议您改用UNION ALL版本,并减少每个语句发送的行数。另一个解决方案是构建一个PL / SQL块来进行插入。 Oracle似乎比大型SQL更好地解析大型PL / SQL,但该解决方案更复杂。
(顺便说一句,在SQL Developer中它运行得更快可能只是巧合。由于问题在于解析时间,第二次运行它总是会更快。)