简体   繁体   English

无法使用WLS 12.1.3的连接池中的Callable语句

[英]Not able to use Callable statement from Connection Pool from WLS 12.1.3

I have created Datasource and try to get connection object using the below code, 我已经创建了数据源,并尝试使用以下代码获取连接对象,

        Hashtable ht = new Hashtable();         
        ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        ht.put(Context.PROVIDER_URL, "t3://localhost:7001");            
        java.sql.Connection vendorConn = null;
        try {
            ctx = new InitialContext(ht);
            javax.sql.DataSource ds
                    = (javax.sql.DataSource) ctx.lookup("jdbc/myDataSource");
            conn = ds.getConnection();
             } catch (SQLException e) {
            LOGGER.error(e.getMessage());
             }

Below I have mentioned connection object and callable object, 下面我提到了连接对象和可调用对象,

weblogic.jdbc.rmi.SerialConnection_weblogic_jdbc_rmi_internal_ConnectionImpl_weblogic_jdbc_wrapper_JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection_12130_WLStub@d4
cstmt = (weblogic.jdbc.rmi.SerialCallableStatement_weblogic_jdbc_rmi_internal_CallableStatementStub_weblogic_jdbc_rmi_internal_CallableStatementImpl_weblogic_jdbc_wrapper_CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper_12130_WLStub) weblogic.jdbc.rmi.SerialCallableStatement_weblogic_jdbc_rmi_internal_CallableStatementStub_weblogic_jdbc_rmi_internal_CallableStatementImpl_weblogic_jdbc_wrapper_CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper_12130_WLStub@145

I am getting the below exception when i called a store procedure using callable 我使用callable调用存储过程时遇到以下异常

java.sql.SQLException: weblogic.rmi.extensions.RemoteRuntimeException: java.sql.SQLException:weblogic.rmi.extensions.RemoteRuntimeException:

Unexpected Exception
    at weblogic.jdbc.rmi.SerialStatement.close(SerialStatement.java:126)
    at weblogic.jdbc.rmi.SerialStatement.close(SerialStatement.java:110)

    at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:451)
    at weblogic.ejb.container.internal.MDListener.transactionalOnMessage(MDListener.java:375)
    at weblogic.ejb.container.internal.MDListener.onMessage(MDListener.java:310)
    at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:4855)
    at weblogic.jms.client.JMSSession.execute(JMSSession.java:4529)
    at weblogic.jms.client.JMSSession.executeMessage(JMSSession.java:3976)
    at weblogic.jms.client.JMSSession.access$000(JMSSession.java:120)
    at weblogic.jms.client.JMSSession$UseForRunnable.run(JMSSession.java:5375)
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
java.sql.SQLException: prepareStatement, Exception = Unexpected Exception
    at weblogic.jdbc.rmi.RMIWrapperImpl.invocationExceptionHandler(RMIWrapperImpl.java:102)
    at weblogic.jdbc.rmi.RMIStubWrapperImpl.invocationExceptionHandler(RMIStubWrapperImpl.java:34)
    at weblogic.jdbc.rmi.SerialConnection.prepareStatement(SerialConnection.java:236)


    at weblogic.ejb.container.internal.MDListener.execute(MDListener.java:451)

Please suggest is this the right way to use Datasource connection where all my sql statements are working but procedure is not getting called and also I need Is it required to typecast the SerialConnection to sql.Connection. 请建议这是使用数据源连接的正确方法,其中所有我的sql语句都在工作,但未调用过程,并且我需要是否需要将SerialConnection类型转换为sql.Connection。

CallableStatement cst = null;
            try {
                cst = conn
                        .prepareCall("{call myProc(?,?,?,?,?,?,?,?)}");
                final String typeTableName = "studentdetails";

                cst.setInt(1, student.getEmpid());
                cst.setInt(2, student.getOrgid());
                cst.setInt(3, student.getYearid());
                cst.setString(4,  student.getClassType());
                cst.setInt(5, student.getStudentid());
                cst.registerOutParameter(6, Types.ARRAY, typeTableName);
                cst.registerOutParameter(7, java.sql.Types.VARCHAR);
                cst.registerOutParameter(8, java.sql.Types.VARCHAR);
                                long startTime=System.currentTimeMillis();
                cst.execute();
                                String dat=cst.getString(7);
                                 //Array arr = cst.getArray(6);
                                long endTime=System.currentTimeMillis();

                if (null != cst.getObject(6)) {
                    data = (Object[]) ((Array) cst.getObject(6)).getArray();
                }

If I use datasource, I am getting cst.getObject(6) as null, but if use normal jdbc connection it is working fine by providing the object. 如果使用数据源,则将cst.getObject(6)设置为null,但是如果使用普通的jdbc连接,则通过提供对象可以正常工作。

If you are using Weblogic you must add the following element to your weblogic.xml 如果使用的是Weblogic,则必须将以下元素添加到weblogic.xml中

<resource-description>
  <res-ref-name>datasource_ref</res-ref-name>
  <jndi-name>jdbc/myDataSource</jndi-name>
</resource-description>

Then you must reference it from your deployment descriptor web.xml by adding following element 然后,必须通过添加以下元素从部​​署描述符web.xml中引用它

<resource-ref>
    <res-ref-name>datasource_ref</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>    
</resource-ref>

Then you can reference your Data Src from your Java code like follows, 然后,您可以像下面这样从Java代码中引用Data Src,

Context cntxt= (Context)new InitialContext().lookup("java:comp/env");
DataSource ds= (DataSource)cntxt.lookup("datasource_ref");

Or by using resource injection like follows, 或使用如下所示的资源注入

@ApplicationScoped
public class DBHandler{
   @Resource(name="datasource_ref")
   private javax.sql.DataSource myDB;

   public Connection getConnection(){
      return myDB.getConnection();
   }
}

And you can use it on demand anywhere using CDI 您可以使用CDI在任何地方按需使用它

DBHandler handler = CDI.current().select(DBHandler.class).get();

Or by field injection 或通过现场注入

@Inject
javax.enterprise.inject.Instance<DBHandler> instance;
....
void persist(){
    DBHandler handler=instance.get();
    Connection con= handler.getConnection();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM