Недавно я решил похожую проблему в приложении JSE, использующем MySQL.Как и в вашем случае, мне нужно было использовать существующего поставщика соединений.
В моем случае я использовал Apache Commons DBCP .Эта структура пула соединений позволяет мне создавать пул соединений через источник данных, а затем регистрировать пул под поддельным именем драйвера, которое вы можете использовать в конфигурации JPA в файле persistence.xml.
Вот как я могусделал это.Сначала я зарегистрировал пул соединений на основе исходного источника данных, а также зарегистрировал поддельный драйвер для этого заданного пула.
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");
Но не только для этого вы можете использовать этот URL в своем файле persistence.xmlфайл для настройки источника ваших соединений для 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();
Используя этот URL JDBC, вы теперь можете иметь доступ к соединениям в пуле ичерез него к исходному источнику данных.