Tag: oracle

Oracle JDBC预取:如何避免RAM耗尽

使用Oracle java JDBC(ojdbc14 10.2.x),加载具有多行的查询需要永远(高延迟环境。显然,Oracle JDBC中的默认预取是默认大小“10”,这需要每10行一次往返时间。我试图设置一个积极的预取大小,以避免这种情况。 PreparedStatement stmt = conn.prepareStatement(“select * from tablename”); statement.setFetchSize(10000); ResultSet rs = statement.executeQuery(); 这可以工作,但我得到一个内存不足的例外。 我曾经假设setFetchSize会告诉它在它们进入时缓冲“那么多行”,使用每行所需的RAM。 如果我运行50个线程,即使使用16G的-XMX空间,它也会耗尽内存。 感觉几乎像泄漏: Exception in thread “main” java.lang.OutOfMemoryError: Java heap space at java.lang.reflect.Array.newArray(Native Method) at java.lang.reflect.Array.newInstance(Array.java:70) at oracle.jdbc.driver.BufferCache.get(BufferCache.java:226) at oracle.jdbc.driver.PhysicalConnection.getCharBuffer(PhysicalConnection.java:7422) at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:983) at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:273) at oracle.jdbc.driver.T4CTTIdcb.receive(T4CTTIdcb.java:144) at oracle.jdbc.driver.T4C8Oall.readDCB(T4C8Oall.java:771) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:346) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205) at […]

为什么hibernate在插入和删除操作期间会生成’T_’前缀tableName?

数据库:ORACLE 我们在hibernate和hbm文件中使用ImprovedNamingStrategy,我们明确地给出了表名。 但是,仍然,在删除和插入操作期间,它生成’T_’作为前缀,’HT_’作为一些表的前缀。 这导致SQLGrammarException: org.hibernate.exception.SQLGrammarException:无法执行语句 请注意,使用Oracle数据库时会发生这种情况,HSQL或Postgres不会发生这种情况。

具有JPA的不同数据库的不同列类型

根据使用的数据库,是否可以使用JPA定义不同的列类型? 我需要将id存储为uuid,它必须是可以保持的。 那就是问题所在。 PostgreSQL有’uuid’,MSSQL’uniqueidentifier’而且Oracle什么都没有,我想必须使用’RAW’。 有人有想法可以帮助我吗? 编辑:当前使用java.util.UUID生成ID并将其作为varchar存储在数据库中。 但是由于该数据类型的性能问题,我想将id存储为uuid类型。 对于Oracle,必须使用RAW类型,因为不存在uuid类型。 如何告诉JPA在Oracle中使用带PostgreSQ / MSSQL和RAW类型的uuid类型?

仅使用一组样本数据创建“生产”的“测试数据库”副本

我们有2个Oracle数据库。 一个是我们的生产客户数据库。 另一个是测试数据库。 测试数据库是没有任何数据的生产副本……只是空表。 我试图找到一种有效的方法将一组样本数据从Production db复制到Test。 我需要从Customer表中的PK样本列表开始,并编写一个过程来使用该样本填充测试数据库Customer表。 然后,我需要根据示例使用相关数据填充子表。 我们曾经有一个Java进程,它将使用预准备语句从Production中选择数据…根据结果集构建文件…然后使用update语句将其放入Test db。 这非常低效。 我不是DBA所以我对这个领域知之甚少。 我试图谷歌一些关于数据库链接的信息,但找不到很好的例子。 有谁知道这样做的方法……或者,至少给我一个起点?

部分失败时的executeBatch行为

我有一个java 1.6应用程序,它使用批量插入来使用jdbc驱动程序在Oracle数据库中插入记录。 正如您在Statement对象上所知,有一个名为executeBatch()的方法,我们将其用于批量更新。 它有一个返回类型的int数组,其中包含每个记录的执行结果。 但它也会在出现错误时抛出BatchUpdateException,我们也可以从中获取结果int数组。 我的问题是我应该期待什么样的错误情况BatchUpdateException和什么时候我应该期望没有抛出exception但是对于某些记录我得失败。 注意:问题特别针对Oracle JDBC。 为了更清楚,我已经看到在执行executeBatch()之后的情况我没有得到BatchUpdateException,但是一些insert语句失败了。 我的问题是关于可能发生的情况? 这是Statement.executeBatch()方法的返回javadoc。 根据这里的一般意见,当一个条目失败时,执行抛出BatchUpdateException然后在哪种情况下我们可以预期返回数组中的某些条目失败。 * @return an array of update counts, with one entry for each command in the * batch. The elements are ordered according to the order in which * the commands were added to the batch. * * * If the value of an […]

如何在Tomcat 7.0.47启动时注册oracle jdbc驱动程序?

我将ojdbc6.jar复制到tomcat安装文件夹中的lib文件夹。 当我部署在JDBC连接中使用Oracle驱动程序的Web App时,服务器说无法找到驱动程序类,并且我被迫手动执行DriverManager.registerDriver,然后它可以工作。 可以这样做,所以驱动程序在启动时注册,我不必手动创建连接池吗?

Spring连接池问题

我没有Java和Spring的经验。 我尝试编写一个使用JdbcTemplate进行数据访问的程序。 我使用DBCP池,这里是: 我的应用程序执行多个更新操作,然后抛出exception: 7053 [SenderThread-0] DEBUG org.springframework.jdbc.datasource.DataSourceUtils – Fetching JDBC Connection from DataSource Exception in thread “SenderThread-0” org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found The Connection descriptor used by the client was: 192.168.2.7:1521:xe ) […]

模拟长时间运行的Oracle DB查询

什么是最简单的(最好没有任何新的表创建)运行数据库查询的方式,这需要在Oracle DB中花费很长时间(至少几分钟)?

如何在Oracle下处理大型事务?

我们的应用程序基于Hibernate 3.5,Spring 3.1和Oracle下我继续运行Max Cursors Exceeded问题,主要是在处理大型事务时(涉及的实体数量大,执行的查询数量)。 在H2,MS SQL Server或MySQL上运行应用程序时不会出现此类问题。 如果我正确理解了我的调查结果,Oracle会为事务中构建的每个ResultSet创建一个游标,这些游标只有在Connection上调用close (即Hibernate Session)时才会释放。 我的问题(现在): 在交易正在进行时,有没有办法让Oracle清理游标? 在事务中的特定点之后,有许多查询结果不需要,但Oracle似乎保持游标打开。 是否有“正常”的最大光标设置? 默认值为50,我们的大多数客户都设置了400-600个游标,但我见过的一些论坛post似乎表明几千个更常见。 当我们建议将最大游标数量增加到(例如)5000时,我们似乎也从我们的客户端DBA获得了很多回击。这真的是一个大问题吗? 坦率地说,我读过的大多数论坛帖都与ResultSet / Statement / Connection泄漏有关,但是根据我们的分析,我们没有它们; 当我们关闭连接时,当前光标计数恢复正常。 我们似乎是唯一一个在单个事务中尝试执行几百个操作的问题。 这真的是这个exception吗? 谢谢你的建议; 这些东西甚至使我的白发脱落

防止JBoss 7上的JNDI数据源的Oracle连接自动提交(Jeeves DBMS)

我目前在JBoss 7中使用Oracle JNDI数据源的自动提交设置有一个奇怪的情况。 大纲 我想部署的应用程序,我可以检查但不能更改,从连接池获取连接,并在某些语句后尝试提交。 显然,连接默认情况下autocommit设置为’true’,因此引发exception。 You cannot commit with autocommit set! 我不能做什么 由于我无法更改应用程序源,因此以下“解决方案”不适用: con.setAutoCommit(false); 我尝试了什么 我查看了standalone.xml的XML Schema,发现了数据源定义中的两个有希望的元素: false 但这被忽略了。 此外,我尝试使用具有以下属性的xa-datasource: false 但autoCommit属性属于连接,而不属于数据源,因此引发了PropertyNotFoundexception。 我的问题 如何在JBoss7下的JNDI数据源中将Autocommit设置为false,我错过了什么? 我的定义 jdbc:oracle:thin:@****:****:**** false oracle.jdbc 10 100 true false FailingConnectionOnly ***** ***** 5000 1 更新 代码片段: public AccessManager(jeeves.resources.dbms.Dbms dbms, SettingManager sm) throws SQLException { List operList = dbms.select(“SELECT * FROM Operations”).getChildren(); […]