楼主: jaunt

[精华] [TIP]关于Java开发中使用Oracle数据库的一点注意事项(原创)

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
41#
发表于 2005-8-2 21:49 | 只看该作者
最初由 cc59 发布
[B]

确实是要经常重用.

但是也要看你如何来处理了.不可能在一处循环里面无限次的来使用.那样肯定会出现连接数不够用的情况了. [/B]


那这种情况下,connection就应该在循环外定义
而不是在循环中反复get然后又colse

使用道具 举报

回复
论坛徽章:
0
42#
发表于 2005-8-3 09:17 | 只看该作者
我正巧碰上一个类似的游标溢出问题,不过是使用hibernate招致的,和大家一起分析
软件环境:
Oracle 8i
JDK 1.4.2
Hibernate 3.0

Java代码如下:
java代码:  


net.sf.hibernate.cfg.Configuration  config = ...
SessionFactory sessions = config.buildSessionFactory();
Session dataSession = sessions.openSession();
Transaction tx = dataSession.beginTransaction();
for(int i=0; i<A_BIG_NUM; i++) {
  ...
  dataSession.saveOrUpdate(...)
}
tx.commit();
dataSession.close();



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/ASong</property>
<property name="connection.username">ASong</property>
<property name="connection.password">123456</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<!-- jakarta commond DBCP Connection Pool -->
<property name="hibernate.connection.provider_class">net.sf.hibernate.connection.DBCPConnectionProvider</property>
<property name="hibernate.dbcp.maxActive">300</property>
<property name="hibernate.dbcp.whenExhaustedAction">1</property>
<property name="hibernate.dbcp.maxWait">3000</property>
<property name="hibernate.dbcp.maxIdle">10</property>
<property name="hibernate.cache.provider_class"> net.sf.hibernate.cache.HashtableCacheProvider</property>
<!-- prepared statement cache -->
<property name="hibernate.dbcp.ps.maxActive">300</property>
<property name="hibernate.dbcp.ps.whenExhaustedAction">1</property>
<property name="hibernate.dbcp.ps.maxWait">3000</property>
<property name="hibernate.dbcp.ps.maxIdle">100</property>
<!-- optional query to validate pooled connections: -->
<property name="hibernate.dbcp.validationQuery select">1</property>
<property name="hibernate.dbcp.testOnBorrow">true</property>
<property name="hibernate.dbcp.testOnReturn">false</property>
<!-- jakarta commond DBCP Connection Pool -->
<property name="show_sql">false</property>
<property name="transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.jdbc.fetch_size">50</property>
<property name="hibernate.jdbc.batch_size">30</property>
<mapping resource="ASong.hbm.xml"/>
</session-factory>
</hibernate-configuration>
错误提示信息:
prepareStatement from pool failed, cause: ORA-01000: maximum open cursors exceeded
at org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:136)
at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:216)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:323)
at net.sf.hibernate.impl.BatcherImpl.getPreparedStatement(BatcherImpl.java:249)
at net.sf.hibernate.impl.BatcherImpl.prepareStatement(BatcherImpl.java:61)
at net.sf.hibernate.impl.BatcherImpl.prepareStatement(BatcherImpl.java:56)
at net.sf.hibernate.impl.BatcherImpl.prepareBatchStatement(BatcherImpl.java:109)
at net.sf.hibernate.persister.EntityPersister.update(EntityPersister.java:660)
... 9 more
Caused by: java.sql.SQLException: ORA-01000: maximum open cursors exceeded
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120)
at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:586)
at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:385)
at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:413)
at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:119)
at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:92)
at oracle.jdbc.driver.OracleConnection.privatePrepareStatement(OracleConnection.java:950)
at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:802)
at org.apache.commons.dbcp.PoolingConnection.makeObject(PoolingConnection.java:223)
at org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:792)
at org.apache.commons.dbcp.PoolingConnection.prepareStatement(PoolingConnection.java:130)
... 16 more

我的分析:
估计是需要适当地 close statement,问题是这些工作在hibernate下是怎么实现的?

使用道具 举报

回复
论坛徽章:
0
43#
发表于 2005-8-3 09:43 | 只看该作者
原来是这样,真的很感谢

使用道具 举报

回复
论坛徽章:
22
授权会员
日期:2005-11-27 17:58:592012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:58马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14
44#
发表于 2005-11-13 11:43 | 只看该作者
上次遇到这个问题还不知道怎么解决呢

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
9
授权会员
日期:2005-12-23 16:28:18会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44铁扇公主
日期:2007-10-26 16:08:47生肖徽章2007版:鸡
日期:2008-01-02 17:35:532009新春纪念徽章
日期:2009-01-04 14:52:282009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
45#
发表于 2005-11-13 19:21 | 只看该作者
刚开始做java项目,学习!

使用道具 举报

回复
论坛徽章:
0
46#
发表于 2005-11-13 22:29 | 只看该作者
虽然我现在还看不太懂,但是也一样支持斑竹,
相信有一天我也会明白的 !呵呵

使用道具 举报

回复
论坛徽章:
0
47#
发表于 2005-11-19 12:43 | 只看该作者
谢谢,受益多多啊

使用道具 举报

回复
论坛徽章:
37
生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
48#
发表于 2006-2-16 08:47 | 只看该作者
又學習了一次..,.3ks.

使用道具 举报

回复
论坛徽章:
8
49#
发表于 2006-2-16 08:59 | 只看该作者
写程序需要注意代码的严谨,这些错误可能在现在你的测试里面不会出现,但是如果随着用户数目的增加会不会呢?

使用道具 举报

回复
论坛徽章:
9
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鸡
日期:2008-01-02 17:35:53生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:猪
日期:2009-03-10 21:17:25生肖徽章2007版:猴
日期:2009-03-10 21:23:27生肖徽章2007版:牛
日期:2009-03-10 21:26:49生肖徽章2007版:鸡
日期:2009-03-10 21:36:09ITPUB8周年纪念徽章
日期:2009-09-27 10:21:22祖国60周年纪念徽章
日期:2009-10-09 08:28:00
50#
发表于 2006-7-12 00:25 | 只看该作者
 可在finally { }
把打开的资源关闭掉

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表