系统从MySql数据库移植到了Oracle数据库。由于本人对Oracle数据库不是很了解。
除了数据转换了过来,其他配置也不懂做
现在系统运行偶尔会出现连接超时异常和游标超出异常。
这些问题在使用MySql数据库时都没有出现过的。
异常如下:
2010-12-02 10:58:25,576 ERROR [STDERR] com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.ConnectException
MESSAGE: Connection refusedSTACKTRACE:java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:153)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:171)

另一个游标超出的异常是
2010-11-29 10:58:19,013 ERROR [org.jboss.web.localhost.Engine] ----- Root Cause -----
com.create.webengine.wf.admin.workflowadmin.exceptions.WorkflowAdminException: Error in getPageToDoWorkItems....
SQLException while getWorkItems from wf_work_item :
ORA-01000: maximum open cursors exceeded at com.create.webengine.wf.admin.workflowadmin.ejb.WorkflowAdminEJB.getPageToDoWorkItems(WorkflowAdminEJB.java:676)
at sun.reflect.GeneratedMethodAccessor115.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:660)
at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:186)
at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:77)
at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:107)
at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:282)
请问这些异常是否可以通过修改Oracle的配置来解决?
相关配置能否告诉我。谢谢了!

解决方案 »

  1.   


    ORA-01000: maximum open cursors exceeded
    打开的游标超过系统设置的数量 应该是你开了过多的游标没有释放(close cursor)
      

  2.   


    1.这个不一定是你游标没有关闭的原因,有可能是你同一个session请求的游标的数目过多,但是没有及时的释放,比如你使用循环打开了很多的游标,但是你循环里面没有释放游标,释放操作没有完成,这样游标的请求数目和你循环的次数成正比,这样的应用是可以优化的。
    2.如果你不想优化应用程序,你可以使用使用这个语句查询下,当前系统的最大的游标请求数目.
    select sid,count(*) from v$open_cursor group by sid
    然后加大游标上限参数
    alter system set open_cursor=(>上面的最大值) sope=spfile
    最后
    重启数据库
      

  3.   

    怎么看都是mysql的异常啊,跟oracle有什么关系?
    楼主的connection driver配置对吗?
      

  4.   

    不懂 mysql ,不知道mysql 的游标是不是自动关闭的呢 Oracle 里面的游标如果显示的Open的话,那么就要显示的 close
      

  5.   

    查看一下系统参数
    SQL>show parameters open_cursors;
    是不是设置过小,把它设置大一些,比如说500
    SQL>alter system set open_cursors=400;
    如果仍然报错,可能是你的代码中打开游标没有关闭造成的。
      

  6.   

    查看一下系统参数
    SQL>show parameters open_cursors;
    是不是设置过小,把它设置大一些,比如说1000
    SQL>alter system set open_cursors=500;
    如果仍然报错,可能是你的代码中打开游标没有关闭造成的。
      

  7.   

    这位朋友谢谢你的提示,该处确实是获取MySQL连接时出现了一些异常,该问题已经解决现在问题主要就是集中在Oracle游标超出这里。
      

  8.   


    我查询了,Oracle默认游标打开数为300(安装好后没动过)。如果解决办法是去手动的更改这个游标打开数
    那是治标不治本,同样的程序在MYSQL和SQL Server都不会有异常,迁移到Oracle时运行一段时间就会出现。
    真是头疼啊
      

  9.   

    各种数据库对游标的需求不一样。
    你最好检查一下你的应用,看看statement对象是不是打开过多,而没有及时关闭。