我使用的是INFORMIX数据库,有时需要使用INFORMIX JDBC中附加的功能,如IfxStatement的getSerial()方法,可是执行 语句         int iid=((com.informix.jdbc.IfmxStatement)stmt).getSerial(); 
时会出错,org.apache.tomcat.dbcp.dbcp.DelegatingStatement cannot be cast to com.informix.jdbc.IfmxStatement如果是用
ctx=new InitialContext();
ds=ctx.lookup(...);
conn=ds.getConnection();
stmt=conn.createStatement();
做的就会出现上面的错误,
但用
Class.forName("com.informix.jdbc.IfxDriver");
conn=DriverManager.getConnection(url);
stmt=conn.createStatement();
做就不会出错,
请教一下,难道配置数据源,JDBC驱动还要另外做些什么吗? 

解决方案 »

  1.   

    (com.informix.jdbc.IfmxStatement)stmt
    你这个强制类型转换的时候出的错,你的stmt的类型是org.apache.tomcat.dbcp.dbcp.DelegatingStatement
    和com.informix.jdbc.IfmxStatement没有继承关系,怎么能转换?看一看api,如果提供方法转换,就使用方法,显然这里不能强转
    抢分了强分了
      

  2.   

    com.informix.jdbc.IfmxStatement这个类需要放到你的lib库中。如果没有当然报错。
      

  3.   

    org.apache.tomcat.dbcp.dbcp.DelegatingStatement cannot be cast to com.informix.jdbc.IfmxStatement 
    是说不能转换
      

  4.   

    如果你的连接池配置的是对的,可能就是dbcp的自己的问题了
      

  5.   

    不使用IfmxStatement强制转换,一切都正常,不过因为数据库的问题,需要用到IfmxStatement的getSerial()方法,所以才要做强制转换的.
      

  6.   

    看样子应该是取得的connection的类型不一样,
    Class.forName("com.informix.jdbc.IfxDriver"); 
    conn=DriverManager.getConnection(url); 
    返回的是informix驱动提供的connection用dbcp返回的估计是一个 动态connection之类的东西,不知道你的连接池里有没有指定 驱动的类com.informix.jdbc.IfmxStatement,如果指定了的话,还是出现这个问题,那就说明dbcp返回的是一个各个数据库通用的对象,你只能调用通用的方法,而无法调用某数据库特有的方法。个人分析,虽然没用过informix,但是从你提供的信息分析感觉应该是这个样子
      

  7.   

    请教一下怎样在连接池里指定 驱动的类com.informix.jdbc.IfmxStatement
      

  8.   

    不是你自己配的数据源吗?用的是tomcat的数据源吧,有一种方式是用tomcat的后台管理去配置,还有一种是在server.xml里,然后再web.xml引用一下。
    一般都是用后者,红色的地方是驱动,我这里是oracle
    <Context path="/adminroot" docBase="adminroot" debug="0" reloadable="true">
             <Resource name="jdbc/myDataSource" auth="Container"
                  type="javax.sql.DataSource">
        </Resource>
        <ResourceParams name="jdbc/myDataSource">
          <parameter>
            <name>factory</name>
            <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
          </parameter>
          <parameter>
            <name>maxActive</name>
            <value>200</value>
          </parameter>
          <parameter>
            <name>maxIdle</name>
            <value>30</value>
          </parameter>
          <parameter>
            <name>maxWait</name>
            <value>-1</value>
          </parameter>
          <parameter>
            <name>username</name>
            <value>shinwa</value>
          </parameter>
          <parameter>
            <name>password</name>
            <value>shinwa</value>
          </parameter>
          <parameter>
            <name>driverClassName</name>
            <value>oracle.jdbc.driver.OracleDriver</value>
          </parameter>
          <parameter>
    <name>url</name> 
    <value>jdbc:oracle:thin:@192.168.2.27:1521:orcl</value>
    </parameter>
        </ResourceParams>
            </Context>
      

  9.   

    现在的应用服务器的jndi数据源都会在你的Connection上面包一层东西,这样你就不能使用那些特殊方法了tomcat,websphere,weblogic都会你试试直接用dbcp看看,如果可以的话就不要用jndi数据源了
      

  10.   

    com.informix.jdbc.IfmxStatement这个类需要放到你的lib库中。如果没有当然报错。
      

  11.   

    com.informix.jdbc.IfmxStatement这个类需要放到你的lib库中。如果没有当然报错。
      

  12.   

    http://commons.apache.org/dbcp/configuration.html注意里面这句话accessToUnderlyingConnectionAllowed false Controls if the PoolGuard allows access to the underlying connection.When allowed you can access the underlying connection using the following construct:    Connection conn = ds.getConnection();
        Connection dconn = ((DelegatingConnection) conn).getInnermostDelegate();
        ...
        conn.close()中文的:
    http://hi.baidu.com/yyflyons2008/blog/item/ff0e75008c512016738b65ae.html
      

  13.   

    感谢 palm_civet ,成功了.