Tag: oracle

在webapp中从java设置Oracle NLS_LANGUAGE

我对JDBC的理解是它根据JVM的默认Locale自动设置Oracle NLS_LANGUAGE / NLS_TERRITORY会话参数。 这对于独立的swing应用程序来说很方便,但对于java webapp似乎毫无用处。 我能想到的唯一解决方案是在实际进行数据库查询之前专门设置会话参数,类似于: Connection c = // However you get it. Statement s = c.createStatement(); s.execute(“alter session set NLS_LANGUAGE = ‘SPANISH'”); // Do actual query here 我的问题: 这是从webapp设置Oracle语言/国家/地区参数的最佳方法吗? 由于Oracle参数采用语言名称而不是代码,是否存在从java / ISO语言代码到Oracle语言名称的映射? 例如,我可以使用Locale.getDisplayLanguage()并且安全吗?

在Java中复制Oracle DES加密

我最近问了一个关于Oracle加密的问题。 在为自己寻找解决方案的过程中,我决定将加密(好的,混淆)移到应用程序端以执行某些任务。 我的问题是数据库已经以某种方式加密数据,我需要Java代码来复制该function,因此一个系统加密的文本可以被另一个系统解密,反之亦然。 我希望加密与数据库已经在进行的操作兼容,但是找不到准确描述Oracle正在做什么的文档。 我如何用Java复制它? dbms_obfuscation_toolkit.DESEncrypt( input_string => v_string, key_string => key_string, encrypted_string => encrypted_string ); RETURN UTL_RAW.CAST_TO_RAW(encrypted_string); 无论我尝试什么,似乎Java DES加密与Oracle不同。

当关闭连接池需要太多时间时,如何强制关闭连接池中的连接?

有时关闭连接需要花费大量时间,例如超过10分钟到1小时,或者更糟,即使是无限期,取决于查询的重量或速度。 在客户端因为花费太多时间而取消查询的情况下,我希望尽快释放使用的底层连接。 我尝试取消PreparedStatement,关闭它,然后关闭结果集,然后最后关闭连接。 几乎立即取消。 关闭PreparedStatement和ResultSet需要花费太多时间,我必须将它包装在Callable with timeout中,以便在适当的时候跳过该进程并继续关闭连接本身。 我还没有什么运气可以试试。 我该如何处理? 我不能简单地让连接不公开,我不能让用户等待10分钟才能进行另一个类似的查询。 是什么原因导致连接关闭需要花费太多时间? 还有什么我能做的吗? 您认为Oracle查询提示会有帮助吗? 顺便说一下,我正在通过瘦型驱动程序使用Oracle JDBC。 更新: 显然,可以通过在connectionCacheProperties中配置TimeToLive属性来强制关闭连接,该属性会在特定时间内关闭连接。 但是,我需要的是根据需要。 这值得一提,因为这certificate可以像连接池那样强制关闭它。 事实上,我甚至在我的日志上收到以下消息。 ORA-01013: user requested cancel..

Oracle数据库:DBMS_ALERT与java应用程序的使用

我有一个Java应用程序服务器使用JDBC与oracle 11.2数据库服务器通信。 客户端的请求被发送到应用程序服务器,该服务器运行调用数据库中第一个存储过程的java方法。 我希望java方法在调用存储过程之后等待来自数据库的信号(该信号表明某些结果已准备好从数据库中检索)。 为了避免轮询数据库,可以使用DBMS_ALERT来通知java方法(或方法,因为多个实例可能正在运行,每个唯一用户一个实例),结果已准备好检索,在这种情况下,java方法可以继续执行其余的代码? 有人可以提供在这种情况下使用DBMS_ALERT的简单示例吗? 也就是说,如何在数据库中配置它以便当表中的预定字段改变时(例如,到预定值,例如“完成”)发送警报,以及如何配置java方法使得它可以接收警报消息(包括如何处理此消息以检查其内容,例如if (received_message == ‘done’)等)?

Oracle ResultSetMetaData getPrecision / getScale

我使用Oracle的JDBC瘦驱动程序(10.2.0.3)连接到Oracle 10g数据库。 我想获得有关数据库列的信息,因此我使用ResultSetMetaData 。 我需要的最重要的信息是列的类型和长度,所以我使用getColumnType , getPrecision和getScale方法。 如果列类型为“简单”,如VARCHAR2(50), NUMBER(5), NUMBER(6,2)它适用于简单查询( select * from tablename VARCHAR2(50), NUMBER(5), NUMBER(6,2) 。 如果我有一个更复杂的查询( select count(*) from tablename )或基于包含一些复杂计算的视图的查询,这些方法会产生奇怪的结果,如: getScale :-127 getPrecision和getScale都是0 getPrecision :-1 将oracle.jdbc.J2EE13Compliant连接属性设置为true (由几个网页建议)会消除getScale = -127,但仍会返回0/0结果。 我很可能必须为这些奇怪的结果创建一个解决方法,但首先我至少需要一个关于Oracle的ResultSetMetaData行为的综合文档。 例如,对于所有SQL类型而言,具有getPrecision / getScale含义的巨大表将是很棒的。 某处有这样的文档吗?

oracle更改通知问题

我有oracle数据库11.2,我正在尝试让oracle更改通知工作。 但它似乎没有通知我,我正在使用ojdbc6.jar。 表格已登记通知; 通过运行validation select * from USER_CHANGE_NOTIFICATION_REGS 当我从外部客户端执行表更新时,我的监听器没有被调用。 但是,当我关闭/启动数据库时,它会通知。 import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; import oracle.jdbc.OracleConnection; import oracle.jdbc.OracleDriver; import oracle.jdbc.OracleStatement; import oracle.jdbc.dcn.DatabaseChangeEvent; import oracle.jdbc.dcn.DatabaseChangeListener; import oracle.jdbc.dcn.DatabaseChangeRegistration; public class DBChangeNotification { static final String USERNAME= “scott”; static final String PASSWORD= “tiger”; static String URL; public static void main(String[] argv) { if(argv.length java […]

DatabaseMetaData.getColumns返回同义词的空ResultSet

元数据上的方法getColumns()返回一个空的ResultSet用于同义词(对于表和视图,它正确地返回列列表)。 这种情况发生在Oracle 11g Express上并使用最新的Oracle JDBC驱动程序(11.2.3)。 这也适用于其他SQL服务器吗? 欢迎任何帮助/想法来解决这个问题。

Oracle 12的@Temporal(TemporalType.DATE)

在我们的DB中,我们有多个具有Date字段的实体。 Oracle将每个日期视为相同,具有日期和时间部分。 然而,JPA实体通过annotaton @Temporal进行区分。 当我们想要省略时间部分时,我们使用@Temporal(TemporalType.DATE)注释日期字段,Oracle保存00:00:00,如果没有,我们只留下它没有注释。 例: @Entity public class MyEntity implements Serializable { private static final long serialVersionUID = 1L; @Id private long myentityId; @Temporal(TemporalType.DATE) private Date importantDate; //01.01.2015 00:00:00 private Date creationDate; //01.01.2015 10:35:51 … } … MyEntity me = new MyEntity(); me.setImportantDate(new Date()); me.setCreationDate(new Date()); … 我们从Oracle 11升级到Oracle 12,现在不再省略importantDate的时间部分! 我在两个数据库上使用完全相同的程序对此进行了广泛测试。 这实际上打破了我们的应用 我该怎么做才能恢复以前的行为? 更新1:我缩小了问题:驱动程序ojdbc6 […]

Oracle下的NetBeans IDE

我对我刚刚阅读的内容感到有点害怕。 我做了一些研究,因为我想开始用Java编程,我得出结论,NetBeans是我最好的IDE,因为它具有强大的Swing GUI Designer和强大的Jasper Reports报告(iReport)。 然而,甲骨文(即将收购Sun)似乎并不关心NetBeans。 由于我将从现在开始用Java开始构建appz,我想知道您对以下事项的看法: 我是否会继续使用NetBeans,尽管有传言称甲骨文将停止使用它,或者我应该选择另一个IDE? PS:基本上NetBeans是首选,但由于目前的情况,我怀疑这个决定。 谢谢

如何使Hibernate @Lock注释适用于Oracle DB?

我偶然发现了Oracle DB中锁定行的问题。 锁定的目的是防止多个事务从数据库读取数据,因为这些数据会影响新数据的生成并且在事务方面会发生变化。 为了进行锁定,我将@Lock注释放在SpringData查找方法上,该方法检索参与事务的数据。 @Lock(LockModeType.PESSIMISTIC_WRITE) User findUserById(@Param(“id”) String operatorId); 实现此代码后,我收到日志消息 org.hibernate.loader.Loader – HHH000444: Encountered request for locking however dialect reports that database prefers locking be done in a separate select (follow-on locking); results will be locked after initial query executes 此外,它没有任何影响和原因 org.springframework.dao.DataIntegrityViolationException: could not execute batch; SQL [insert into …] 使用实体管理器重写锁时可以解决该问题 entityManager.lock(userByIdWithLockOnReadWrite, LockModeType.PESSIMISTIC_WRITE); 要么 entityManager.unwrap(Session.class).lock(userByIdWithLockOnReadWrite, […]