在J2SE环境中的Hibernate JPA中使用OracleDataSource

时间:2011-04-14 10:53:29

标签: java oracle jpa jdbc

是否可以将Hibernate / JPA配置为在独立环境中使用OracleDataSource?更具体地说,我想要做的是通过persistence.xml文件配置oracle隐式连接缓存。这可能吗?

提前致谢 布赖恩

1 个答案:

答案 0 :(得分:1)

我最近在使用MySQL的JSE应用程序中解决了类似的问题。在您的情况下,我需要它使用现有的连接提供程序。

就我而言,我使用了Apache Commons DBCP。此连接池框架允许我在数据源上创建连接池,然后在伪驱动程序名称下注册池,您可以在persistence.xml文件中的JPA配置中使用该名称。

这就是我做的。首先,我根据原始数据源注册了一个连接池,并且我还为这个给定的池注册了一个假驱动程序。

private ObjectPool getNewConnectionPool(DataSource mySqlDataSource) {
    try {
        GenericObjectPool pool = new GenericObjectPool(null, 10); 
        pool.setTestOnBorrow(true);
        ConnectionFactory factory = new DataSourceConnectionFactory(mySqlDataSource);
        PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(factory, pool, null, "SELECT 1 FROM DUAL", false, true);
        Class.forName("org.apache.commons.dbcp.PoolingDriver");
        PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
        driver.registerPool("myPool", pool);
        return poolableConnectionFactory.getPool();
    } catch (Exception e) {
        throw new RuntimeException("Unable to initialize connetion pooling", e);
    }
}

然后,我不再使用原始数据源,而是继续使用池化数据源。

DataSource dataSource = new PoolingDataSource(getNewConnectionPool(mySqlDataSource));

到目前为止,您有一个基于原始数据源的功能数据源,您可以从中获取连接。您还可以通过为此池注册的虚假驱动程序获取连接,这些也可以来自原始数据源。

Connection conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:myPool");

但不仅如此,您可以在persistence.xml文件中使用此URL来配置JPA的连接源,或者在创建它时提供给EntityManagerFactory的属性。

Map<String, Object> properties = new HashMap<String, Object>();
properties.put("javax.persistence.provider", "org.hibernate.ejb.HibernatePersistence");
properties.put("javax.persistence.jdbc.url", "jdbc:apache:commons:dbcp:myPool");
this.entityManagerFactory = Persistence.createEntityManagerFactory("myUnit", properties);
this.entityManager = this.entityManagerFactory.createEntityManager();

使用此JDBC URL,您现在可以访问池中的连接,并通过它访问原始数据源。