Tag: oracle

JPA Eclipselink数据库更改通知不会使缓存条目无效

我有两个使用Eclipselink 2.4.2进行持久化的Java 1.7应用程序。 一个应用程序是在Glassfish 3.1.2.2中运行的JEE应用程序,另一个是Java SE应用程序。 这些应用程序读取和写入相同的数据,因此可能存在过时的JPA缓存条目。 我试图使用Oracle DCN来解决过时的缓存问题。 我已经按照上面的链接中的描述配置了我的persistence.xml: org.eclipse.persistence.jpa.PersistenceProvider jdbc/DRMS 然而,我仍然得到陈旧的缓存条目。 如果一个应用程序提交对数据库的更改,则第二个应用程序仍会看到其旧的过时缓存条目,而不是新的更改。 使用调试器,我已经确认OracleChangeNotificationListener正在接收数据库事件,但它似乎永远不会使缓存中的任何内容无效。 Eclipselink OracleChangeNotificationListener注册以下侦听器以接收Oracle数据库更改事件: public void onDatabaseChangeNotification(DatabaseChangeEvent changeEvent) { databaseSession.log(SessionLog.FINEST, SessionLog.CONNECTION, “dcn_change_event”, changeEvent); if (changeEvent.getTableChangeDescription() != null) { for (TableChangeDescription tableChange : changeEvent.getTableChangeDescription()) { ClassDescriptor descriptor = OracleChangeNotificationListener.this.descriptorsByTable.get(new DatabaseTable(tableChange.getTableName())); if (descriptor != null) { CacheIndex index = descriptor.getCachePolicy().getCacheIndex(fields); for (RowChangeDescription rowChange : […]

为什么oracle存储过程的执行时间会大大增加,具体取决于它的执行方式?

这是我的问题: 我们有一个名为: HEAVY_SP的存储过程,在所有场景中都使用相同的参数 我们有一个oracle sql开发人员。 这可以称为: IDE 根据执行方式,执行时间会大大增加: (1)直接在查询窗口(IDE )中 CALL HEAVY_SP(0, ‘F’, 5, …) )= 15秒 (我们当前的解决方案) (2)使用IDE = 15秒的特殊按钮 (3)使用dbms_job(预定执行)= 15秒 作业已安排但未执行。 使用IDE执行作业(右键单击并执行) (4)使用dbms_job(即时执行)= 超过01小时,迭代非常慢 (5)从SQL_PLUS(linux)= 超过01小时,迭代很慢 (6)从JAVA = 超过01小时,迭代非常慢 (7)从TOAD = 超过01小时,迭代非常慢 我们吃了很多谷歌页面如下: 为什么此结果一查询,运行速度较慢,在-A-存储过程超在-的查询窗口 甲骨文-PL-SQL过程的运行-慢于SQL Oracle的插入输入-存储过程-非常慢-相比对插入件-运行-手动 存储进程内运行-30-慢通过-java的抗磨合直接上的数据库 所以我的问题是: 为什么Oracle以这种方式行事? 它不应该在所有场景(相同的参数)中表现得快吗? 存储过程必须修改? 如果查询计划,跟踪文件或统计信息显示传送行为,则必须修复存储的prodecure? 为什么在查询窗口中执行速度快? 提前致谢。 [编辑] 遵循@BobJarvis关于统计数据的建议 我们的统计数据是最新的。 甚至,我们重新执行了EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>’SOME_USER’, tabname=>’SOME_TABLE’, cascade => […]

如何使用java读取从存储过程返回的类型的ARRAY?

这是在以下位置发布的问题的延续: 将Bean列表传递给oracle存储过程的Java程序 – 一次性传递整个列表而不是一个接一个地追加对象 我一直在尝试增强上面链接位置中提到的存储过程,并在实现中感到困惑。 而不是VARCHAR2作为过程的输出,我现在想要返回NUM_ARRAY作为过程的输出。 你能帮我实现逻辑来读取我的java代码中的NUM_ARRAY吗? 通常使用Map out = super.execute(inParams)返回输出; 我现在如何将NUM_ARRAY提取到我的bean? The source code implementation is as follows. import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import javax.sql.DataSource; import oracle.jdbc.OracleTypes; import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; import org.apache.log4j.Logger; import org.springframework.jdbc.core.SqlOutParameter; import org.springframework.jdbc.core.SqlParameter; import org.springframework.jdbc.core.SqlTypeValue; import org.springframework.jdbc.object.StoredProcedure; public class RevPrdBrkDwnSP extends StoredProcedure{ private final Logger […]

oracle数组在java中填充了空数据

当我尝试将一个字符串数组抛出到oracle存储过程时: String arrStr[] ={“val1″,”val2″,”val3”}; ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(“STR_ARRAY”, connection ); oracle.sql.ARRAY oracleArray = new oracle.sql.ARRAY(descriptor, connection, arrStr); oracleArray持有空数据,oracleArray.datumArray = {???,???,???}

一次将SQL脚本执行到oracle db一个语句

假设我有一个如下所示的sql脚本: –split statement 1 ALTER TABLE abs ADD (make VARCHAR2(2 byte), model varCHAR2(12 BYTE), built_on DATE, serial varchar2(123 BYTE)); / –split statement 2 declare begin null; end; / –split statement 3 insert into test (v,a,c) values (‘1′,’jjoe;’,’232′); –split statement 4 create or replace function BLAH_BLAH(i_in varchar2) as l_one varchar2(12); l_two varchar2(12); l_three varchar2(12); begin l_one […]

如何在oracle中将表作为out参数

我试图将oracle过程调用的out参数强制转换为对象。 它不起作用,因为 – 据我所知 – 我需要定义一个地图,它告诉方法如何施放它。 如果地图是空的或不正确的填充,它默认为STRUCT类型的Objekt – 这在我的情况下是错误的。 我已经构建了一个示例,它应该说明问题: — Procedure in database PROCEDURE myprocedure ( inputParam IN VARCHAR2 (4), outputOne OUT outputOneSQLType outputTwo OUT outputTwoSQLType); — inside of a package inside a package mypackage — first type create or replace TYPE outputOneSQLType IS TABLE OF tableOneExample — table of type create or replace […]

从Java调用PL / SQL函数时的“SQLException:ORA-06550”

我想使用Java从数据库中检索数据并显示它,所以我创建了这个PL / SQL函数,它返回一个游标: create or replace function std_getInfoFunc return types.cursortype as my_cursor types.cursorType; begin open my_cursor FOR SELECT s.FirstName, s.LastName, s.Address, s.City, s.Province , s.PostalCode, c.CourseName FROM Students s, Courses c, StudentAndCourses cs Where s.StudentID = cs.StudentID AND c.CourseID = cs.CourseID; Return my_cursor; end; 在我的Java代码中,我调用函数如下: try{ CallableStatement cst=connection.prepareCall(“{? = call std_getInfoFunc}”); cst.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); cst.execute(); res=(ResultSet) […]

Hibernate + Oracle IN子句限制,如何解决呢?

我知道这个问题多次发布,但我想询问细节, 使用Oracle,你不能传递超过1000个参数的IN子句,所以使用hracle与oracle可能有一些解决这个问题的方法,如: 1-在每个1000参数列表的IN子句之间使用OR子句,但这不适用,因为oracle的其他限制因为整个查询参数不超过2000 2-使用for循环,每次运行1000个参数列表中的查询,然后追加所有结果,如果需要排序,或者使用不同级别修改的条件api,这不是很好 3-将参数列表放在临时物理表中,并加入它,甚至在子标准中使用它,这个解决方案我不能尝试,因为我不知道如何使用hibernate创建临时表,以及然后用它, 所以如果使用CRITERIA api有任何其他想法请分享,或者即使有一个简单的方法来处理解决方案号码’3′ 问候,

使用Hibernate将Oracle Date映射到Java对象

我收到消息“文字与格式字符串不匹配”。 例如,以下是Java类中的一些方法: public String getDateTime(); public void setDateTime(String date_time); 以下是该类的Hibernate配置文件的映射: 这是该列的DDL: CREATE TABLE “SCHEMA”.”TABLE_NAME” ( “DATE_TIME” DATE, etc. ) 我尝试将type =“date”和“timestamp”(不是同时)设置为hibernate配置中属性的attr,然后将Java类型从String更改为Date,但这给了我一个不同的错误。 我读了一些关于绑定参数的内容,但无法做出正面或反面。 当我从配置中注释掉该属性时,其他一切都正常工作,所以我确定这是我的问题。 令人讨厌的是我有另一个表/类映射,看起来是相同的Oracle Date-> Java String映射,它没有给我这个问题。

Oracle ojdbc8 12.2.0.1被Maven禁止

Oracle ojdbc8 12.2.0.1自2017年12月起被Maven 禁止 ,之前运行良好。 Oracle存储库(setting.xml)上的配置发生了哪些变化? Maven项目: https : //github.com/sgrillon14/MavenSampleOracleJdbc 完整跟踪: https : //travis-ci.org/sgrillon14/MavenSampleOracleJdbc