是否可以将Hibernate / JPA配置为在独立环境中使用OracleDataSource?更具体地说,我想要做的是通过persistence.xml文件配置oracle隐式连接缓存。这可能吗?
提前致谢 布赖恩
答案 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,您现在可以访问池中的连接,并通过它访问原始数据源。