【问题标题】:Oracle Connection Pool ClassOracle 连接池类
【发布时间】:2012-09-30 11:01:50
【问题描述】:

我想在 Helper 类中为 Oracle DB 设置连接池。

public class DbConnection {

// Data source for the pooled connection
private static OracleDataSource dataSource;

// Host
private static final String dbHost = "bla";

// Port
private static final String dbPort = "1521";

// DBname
private static final String database = "orcl";

// DBuser
private static final String dbUser = "bla";

// DBpassword
private static final String dbPassword = "bla";

static {
    OracleConnectionPoolDataSource opds;
    try {
        opds = new OracleConnectionPoolDataSource();
        opds.setURL("jdbc:oracle:thin:@" + dbHost + ":" + dbPort + ":"
                + database);
        opds.setUser(dbUser);
        opds.setPassword(dbPassword);
        dataSource = opds;
    } catch (SQLException e1) {
        System.err.println("Connection failed!");
    }
    try {
        // Load driver
        Class.forName("oracle.jdbc.driver.OracleDriver");

    } catch (ClassNotFoundException e) {
        System.out.println("Driver not found!");
    }
}

public static Connection getConnection() throws SQLException {
    return dataSource.getConnection();
}
}

这是有效的,但它不是非常快,所以我认为我缺少一些东西来让池工作。有什么建议吗?

所以我的外部类只是调用 getConnection() 方法...

Connection conn = DbConnection.getConnection();
...
conn.close();

【问题讨论】:

  • “不是非常快”到底是什么意思?究竟哪一部分慢?打开与 Oracle 的连接可能需要一些时间。您是否查看了有关连接缓存的手册? docs.oracle.com/cd/B28359_01/java.111/b31224/…
  • 阅读我发布的链接。它说“OracleConnectionCache”已弃用,而不是我链接到的部分。顺便说一句:为什么不使用 DBCP 或 C3P0 之类的连接池?

标签: java oracle jdbc connection-pooling


【解决方案1】:

您不应直接使用ConnectionPoolDataSource。它旨在供应用程序服务器中的连接池使用。它本身不提供连接池。另见https://stackoverflow.com/a/12651163/466862

换句话说:您需要使用实际的连接池,例如 DBCP、c3p0 或 BoneCP,或者 UCP(通用连接池)。

【讨论】:

    【解决方案2】:

    您需要使用 OracleDataSource(不是 OracleConnectionPoolDataSource)并设置 setConnectionCachingEnabled(true)。

         private  static OracleDataSource ods = null;
         ...
         static {
            System.out.println("OracleDataSource Initialization");
            try {
                ods = new OracleDataSource();
                ods.setConnectionCachingEnabled(true);
                ods.setConnectionCacheName("mycache");
                ods.setURL("jdbc:oracle:thin:@//server.local:1521/prod");
                ods.setUser("scott");
                ods.setPassword("tiger");
                Properties cacheProps = new Properties();
                cacheProps.setProperty("MinLimit", "1");
                cacheProps.setProperty("MaxLimit", "4");
                cacheProps.setProperty("InitialLimit", "1");
                cacheProps.setProperty("ConnectionWaitTimeout", "5");
                cacheProps.setProperty("ValidateConnection", "true");
                ods.setConnectionCacheProperties(cacheProps);
    
            }
            catch (SQLException e) {
                e.printStackTrace();
            }
        }
    ...
        public static Connection getConnection()
           throws SQLException {
          return ods.getConnection();
        }
    

    完整示例here

    【讨论】:

    • Eclipse 告诉我 setConnectionCachingEnabled 已弃用?
    • 它已被弃用,但在当前的 Oracle JDBC 驱动程序中仍然可以正常工作。如果您对此事实感到不满意,那么还有很多替代品,例如 Proxool 或 C3PO。
    【解决方案3】:

    oracle.jdbc.pool.OracleDataSource.setConnectionCachingEnabled 文档声明如下:

    已弃用。请改用 Oracle 通用连接池。

    您可以下载Oracle Database UCP 并创建您的DataSource,如下所示:

    import oracle.jdbc.pool.OracleDataSource;
    import oracle.ucp.jdbc.PoolDataSource;
    import oracle.ucp.jdbc.PoolDataSourceFactory;
    
    PoolDataSource poolDataSource = PoolDataSourceFactory.getPoolDataSource();
    poolDataSource.setConnectionFactoryClassName(OracleDataSource.class.getName());
    poolDataSource.setURL("jdbc:oracle:thin:@localhost:1521:XE");
    poolDataSource.setUser("SYSTEM");
    poolDataSource.setPassword("****");
    

    【讨论】:

    • 为什么他们会弃用某些东西,然后让你下载你应该使用的东西......
    • "为了给您带来不便,我们希望您停止使用此功能并改用其他我们未提供的功能。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多