论坛首页 入门技术论坛

用java池调用动态存储过程的问题?

浏览 1966 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-07-16  
我们目前的项目中需要在使用java池连接数据库,调用数据库中的存储过程。存储过程中有一段代码调用了动态的存储过程(不是动态sql),这种调用,会出现如下情况。
在第一次调用存储过程的时候,能够得到正确的结果,但是在第二次及以后连续调用时,由于java池的作用,会得到错误的结果。
这是配置文件:
  <!--todo connect pool -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass">
      <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="jdbcUrl">
      <value>jdbc:oracle:thin:@132.228.70.101:1521:dbtest13</value>
    </property>
    <property name="user">
      <value>crm</value>
    </property>
    <property name="password">
      <value>crm</value>
    </property>
    <!-- C3P0 properties -->
    <property name="initialPoolSize">
      <value>5</value>
    </property>
    <property name="minPoolSize">
      <value>1</value>
    </property>
    <property name="maxPoolSize">
      <value>1</value>
    </property>
    <property name="maxStatements">
      <value>0</value>
    </property>
    <property name="checkoutTimeout">
      <value>5000</value>
    </property>
    <property name="maxIdleTime">
      <value>5</value>
    </property>
    <property name="idleConnectionTestPeriod">
      <value>3000</value>
    </property>
    <property name="acquireIncrement">
      <value>5</value>
    </property>
  </bean>
   发表时间:2007-07-17  
    之前这个问题发错地方了,被投入门贴了。
这个问题经过查找,发现了问题的所在。
    oracle中在调用存储过程时,同一个package中的全局变量,如果同一个session连续调用,那么第二次调用时,全局变量的值会是上次调用时的结果。
    正是这个性质引起了我提出的问题。之前有一个全局变量的值没有初始化,第一次调用时,此值是空,执行业务规则能够得到正确的值,第二次调用时,全局变量是上次执行后的结果,而且这个变量在一开始就被直接使用判断了值,所以出现了错误的流程。
    因此在oracle中使用全局变量时,一定要给全局显示变量初始化。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics