首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要纠正WebLogic通用池连接数据源JNDI绑定错误,需要做什么?

要纠正WebLogic通用池连接数据源JNDI绑定错误,需要做什么?
EN

Stack Overflow用户
提问于 2015-04-16 20:05:06
回答 1查看 792关注 0票数 0

简单地建立我所指的JNDI无绑定jndiUnboundDataSource() (UCP)数据源WebLogic的调用可以工作,并且能够创建和返回可用的数据库连接。

jndiBindDataSource()方法将引发以下异常:

意外异常: oracle.ucp.jdbc.PoolDataSourceImpl$23:java.rmi.RemoteException

jndiBindDataSource()方法试图创建UCP数据源,然后将其绑定到JNDI上下文.目的是jndiBoundDataSource()方法能够从JNDI上下文中检索绑定的UCP数据源。此时,我还没有测试jndiBoundDataSource(),因为jndiBindDataSource()失败了。

WebLogic 12.1.3 -通用连接池ConnectionClassFactory:

com.mysql.jdbc.jdbc2.optional.MysqlDataSource

您应该能够从以下来源重新创建错误:

代码语言:javascript
复制
package com.corporate.experiments;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;
import oracle.ucp.jdbc.ValidConnection;

public class WebLogicUniversalConnectionPool extends HttpServlet
{
    @SuppressWarnings("oracle.jdeveloper.java.serialversionuid-stale") private static final long serialVersionUID = 1L;

    // http://docs.oracle.com/middleware/1213/wls/JDBCP/ds_annotation.htm#BABEDEJJ
    // http://docs.oracle.com/middleware/1213/wls/JDBCP/ds_annotation.htm#BABDBHCD

    /**
     *  The name element uniquely identifies a DataSource and is registered with JNDI.
     *  The value specified in the name element begins with a namespace scope.
     *
     *  Java EE Data Source Naming Scopes:
     *
     *  java:comp - Names in this namespace have component visibility.
     *  java:module - Names in this namespace are shared by all components in a module, for example, the EJB components defined in an a ejb-jar.xml file.
     *  java:app - Names in this namespace are shared by all components and modules in an application, for example, the application-client, web, and EJB components in an .ear file.
     *  java:global - Names in this namespace are shared by all the applications in the server.
     *
     *  Java EE Data Source Naming Conventions:
     *
     *  Component visibility:
     *  ---------------------
     *  appname @ modulename @ componentname @ dsname
     *
     *  Module visibility:
     *  ------------------
     *  appname @ modulename @ dsname
     *
     *  Application visibility:
     *  -----------------------
     *  appname @ dsname
     *
     *  Global visibility:
     *  ------------------
     *  dsname
     */

    private static final String DATA_SOURCE_NAME = "app/content";
    private static final String DATA_SOURCE_NAMESPACE = "java:" + DATA_SOURCE_NAME;

    /**
     * @param request
     * @param response
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        // http://docs.oracle.com/database/121/JJUCP/connect.htm#JJUCP8139

        try
        {
            jndiUnboundDataSource();
        }
        catch (Exception exception)
        {
            return; // place break point here
        }

        // create a context bound connection pool data source

        try
        {
            jndiBindDataSource(); // Java Naming and Directory Interface (JNDI)
        }
        catch (Exception exception)
        {
            return; // place break point here
        }

        // get a connection from the bound connection pool data source

        try
        {
            jndiBoundDataSource(); // Java Naming and Directory Interface (JNDI)
        }
        catch (Exception exception)
        {
            return; // place break point here
        }

        return; // place break point here
    }

    // create a context unbound connection pool data source and get a connection

    private DataSource jndiUnboundDataSource() throws SQLException
    {
        DataSource dataSource = createDataSource();

        validateDataSource(dataSource);

        return dataSource;
    }

    // create a context and bind a connection pool data source

    private DataSource jndiBindDataSource() throws NamingException, SQLException
    {
        InitialContext context = createInitialContext();

        DataSource dataSource = createDataSource();

        validateDataSource(dataSource);

        // Unexpected exception: java.rmi.RemoteException: oracle.ucp.jdbc.PoolDataSourceImpl$23;

        context.bind(DATA_SOURCE_NAME, dataSource);

        return dataSource;
    }

    // create a context and look up a connection pool data source

    private DataSource jndiBoundDataSource() throws NamingException, SQLException
    {
        InitialContext context = initialContext();

        PoolDataSource poolDataSource = (PoolDataSource) context.lookup(DATA_SOURCE_NAME);

        validateDataSource(poolDataSource);

        return poolDataSource;
    }

    private InitialContext initialContext() throws NamingException
    {
        Hashtable<String, String> environment = new Hashtable<String, String> ();

        environment.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        environment.put(Context.PROVIDER_URL, "t3://localhost:7101");
        environment.put(Context.SECURITY_AUTHENTICATION, "Container");
        environment.put(Context.SECURITY_PRINCIPAL, "development");
        environment.put(Context.SECURITY_CREDENTIALS, "development");

        return new InitialContext(environment);
    }

    private InitialContext createInitialContext() throws NamingException
    {
        InitialContext initialContext = initialContext();

        initialContext.createSubcontext("corporate");

        return initialContext;
    }

    private DataSource createDataSource() throws SQLException
    {
        PoolDataSource poolDataSource = PoolDataSourceFactory.getPoolDataSource();

        poolDataSource.setConnectionFactoryClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");

        poolDataSource.setURL("jdbc:mysql://localhost:3306/metadata");
        poolDataSource.setUser("root");
        poolDataSource.setPassword("root");

        return poolDataSource;
    }

    private void validateDataSource(DataSource dataSource) throws SQLException
    {
        Connection connection = dataSource.getConnection();

        validateConnection(connection);

        connection.close();
    }

    private void validateConnection(Connection connection) throws SQLException
    {       
        if (null == connection)
        {
            throw new SQLException("Null connection: servlet data source namespace \"" + DATA_SOURCE_NAMESPACE + "\"");
        }

        if (!((ValidConnection) connection).isValid())
        {
            throw new SQLException("Invalid connection: servlet data source namespace \"" + DATA_SOURCE_NAMESPACE + "\"");
        }
    }    
}

这是一个例外:

代码语言:javascript
复制
        Unexpected exception: java.rmi.RemoteException: oracle.ucp.jdbc.PoolDataSourceImpl$23; nested exception is:

        java.io.NotSerializableException: oracle.ucp.jdbc.PoolDataSourceImpl$23
        at weblogic.jndi.internal.WLEventContextImpl.copyObject(WLEventContextImpl.java:400)
        at weblogic.jndi.internal.WLEventContextImpl.bind(WLEventContextImpl.java:279)
        at javax.naming.InitialContext.bind(InitialContext.java:419)
        at com.corporate.experiments.WebLogicUniversalConnectionPool.jndiBindDataSource(WebLogicUniversalConnectionPool.java:123)
        at com.corporate.experiments.WebLogicUniversalConnectionPool.doGet(WebLogicUniversalConnectionPool.java:81)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346)
        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
        at oracle.security.jps.ee.http.JpsAbsFilter$1.run(JpsAbsFilter.java:137)
        at java.security.AccessController.doPrivileged(Native Method)
        at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:315)
        at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:460)
        at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:120)
        at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:217)
        at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:81)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
        at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:220)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:79)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3436)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
        at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572)
        at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:263)
Caused by: java.io.NotSerializableException: oracle.ucp.jdbc.PoolDataSourceImpl$23
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
        at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:440)
        at oracle.ucp.jdbc.PoolDataSourceImpl.writeObject(PoolDataSourceImpl.java:3015)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
        at weblogic.rmi.extensions.server.CBVOutputStream.writeObject(CBVOutputStream.java:80)
        at weblogic.jndi.internal.JNDIHelper.copyObject(JNDIHelper.java:39)
        at weblogic.jndi.WLSJNDIEnvironmentImpl.copyObject(WLSJNDIEnvironmentImpl.java:78)
        at weblogic.jndi.internal.WLEventContextImpl.copyObject(WLEventContextImpl.java:395)
        ... 34 more
EN

回答 1

Stack Overflow用户

发布于 2015-04-17 04:15:27

这看起来像是在定义一个远程数据源。

您不能这样做有很多原因,其中最不重要的原因是javax.sql.DataSource没有扩展java.io.Serializable

您不需要创建自己的数据源并绑定它。您可以使用WebLogic控制台定义它,并在当时给它取一个JNDI名称。然后,WLS负责创建数据源并为您绑定它。所有完整堆栈Java服务器(以及Tomcat )都是这样做的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29684938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档