我想使用以下代码创建Oracle UCP:

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

System.out.println("***** OracleDS_UCP -> start init of PoolDataSource");

            PoolDataSource pool = PoolDataSourceFactory.getPoolDataSource();
            pool.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
            pool.setURL("jdbc:oracle:thin:@localhost:1521:XE");
            pool.setUser("test");
            pool.setPassword("test");
            pool.setMaxStatements(10); // the maximum number of statements that may be pooled or cached on a connection.
            pool.setInitialPoolSize(2);
            pool.setMinPoolSize(1);
            pool.setMaxPoolSize(50);
            pool.setLoginTimeout(60); // one minute
            pool.setConnectionWaitTimeout(60); // one minute
            pool.setAbandonedConnectionTimeout(30 * 60); // thirty minutes
            pool.setMaxIdleTime(60 * 60); // one hour and kill inactive or idle connections
            pool.setInactiveConnectionTimeout(60 * 60); // one hour and kill inactive or idle connections
            pool.setConnectionWaitTimeout(0); // do not wait for a used connection to be released by a client.
            pool.setConnectionHarvestTriggerCount(40);
            pool.setConnectionHarvestMaxCount(10);

我正在使用
<plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.4.0</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Embed-Dependency>ucp,ojdbc6</Embed-Dependency>
                    <Import-Package>
                        org.osgi.framework,
                        javax.sql,
                        javax.naming,
                        oracle.jdbc.pool.OracleDataSource,
                        oracle.ucp.jdbc.PoolDataSourceFactory,
                        oracle.ucp.jdbc.PoolDataSourceImpl,
                        javax.naming.spi,
                        javax.management,
                        javax.management.modelmbean,
                        oracle.jdbc.pool
                    </Import-Package>
                    <Include-Resource>
                        ucp-11.2.0.3.jar,
                        ojdbc6-11.2.0.3.jar
                    </Include-Resource>
                    <Bundle-ClassPath>
                        ucp-11.2.0.3.jar,
                        ojdbc6-11.2.0.3.jar,
                        .
                    </Bundle-ClassPath>
                    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                    <Bundle-Activator>org.test.ucp.activator.Activator</Bundle-Activator>
                </instructions>
            </configuration>
        </plugin>

但是,当我在独立 bundle 包中启动代码时,出现以下错误消息:
    Test Oracle UCP
ERROR: Bundle ucpTest [21] Error starting inputstream:ucpTest-1.0.jar (org.osgi.framework.BundleExce
ption: Activator start error in bundle ucpTest [21].)
java.lang.IllegalArgumentException: interface oracle.ucp.jdbc.LabelableConnection is not visible fro
m class loader
        at java.lang.reflect.Proxy$ProxyClassFactory.apply(Unknown Source)
        at java.lang.reflect.Proxy$ProxyClassFactory.apply(Unknown Source)
        at java.lang.reflect.WeakCache$Factory.get(Unknown Source)
        at java.lang.reflect.WeakCache.get(Unknown Source)
        at java.lang.reflect.Proxy.getProxyClass0(Unknown Source)
        at java.lang.reflect.Proxy.newProxyInstance(Unknown Source)
        at oracle.ucp.jdbc.proxy.ConnectionProxyFactory.createConnectionProxy(ConnectionProxyFactory
.java:78)
        at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:919)
        at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:863)
        at oracle.ucp.jdbc.PoolDataSourceImpl.getConnection(PoolDataSourceImpl.java:855)
        at org.test.osgi.ucp.impl.OracleDS_UCP.getConnection(OracleDS_UCP.java:26)
        at org.test.ucp.activator.Activator.testOracleUCP(Activator.java:41)
        at org.test.ucp.activator.Activator.start(Activator.java:17)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
        at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191)
        at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295)
        at java.lang.Thread.run(Unknown Source)

也许我没有正确配置UCP。您能帮忙解决此问题吗?

最佳答案

彼得,我还没有从事过UCP工作。因此,我可能无法为您提供完整的解决方案,但提示很少:

  • 尝试使用以OSGi bundle形式提供的Apache Commons DBCP。
  • 尝试从BND配置中删除Import-Package指令。 BND很聪明地识别出这一点。然后可以在以后优化您的导入。
  • 尝试将DynamicImport-Package:*指令放入您的BND配置。


  • 尝试上述步骤,并可能将上面的2和3结合起来,然后报告是否可行。

    09-16 10:48