Tom Coupland [
http://community.jboss.org/people/tcoup] created the discussion
"Re: How do you programmatically create datasources in JBoss5"
To view the discussion, visit:
http://community.jboss.org/message/624249#624249
--------------------------------------------------------------
Following 'fans xnet's excellant advise i did create a factory. I even
(eventually) worked out what to put in it!
In order to build an EMF you need to do something like:
{code}
public EntityManagerFactory buildEntityManagerFactory(DataSource datasource) {
Ejb3Configuration ejbconf = new Ejb3Configuration();
ejbconf.setDataSource(datasource);
ejbconf.setProperty("hibernate.dialect",
"org.hibernate.dialect.MySQL5InnoDBDialect");
ejbconf.setProperty("hibernate.show_sql", "false");
//Make transactionally aware
ejbconf.setProperty("hibernate.transaction.manager_lookup_class",
"org.hibernate.transaction.JBossTransactionManagerLookup");
ejbconf.setProperty("jta.UserTransaction",
"java:comp/UserTransaction");
ejbconf.setProperty("hibernate.current_session_context_class",
"jta");
ejbconf.setProperty(HibernatePersistence.TRANSACTION_TYPE,
PersistenceUnitTransactionType.JTA.name());
//Add caching
ejbconf.setProperty("hibernate.cache.provider_class",
"HibernateEhCacheProviderClass");
ejbconf.setProperty("hibernate.cache.use_second_level_cache",
"true");
ejbconf.setProperty("net.sf.ehcache.configurationResourceName",
"META-INF/ehcache.xml");
//Add you entity beans here
ejbconf.addAnnotatedClass(SomeEntityBean.class);
return ejbconf.buildEntityManagerFactory();
{code}
Knocking up a datasource with DBCP looks like:
{code}
public DataSource buildDatasource(String connectionUrl) {
// Create base connection factory that produces raw db connections.
ConnectionFactory connectionFactory = new
DriverManagerConnectionFactory(connectionUrl, libraryUser,
libraryPassword);
// Object pool for pooling raw connections
GenericObjectPool connPool = new GenericObjectPool();
connPool.setMaxActive(maxShardConns);
connPool.setMinIdle(minShardConns);
connPool.setMaxIdle(maxIdleConns);
connPool.setMinEvictableIdleTimeMillis(shardConnTimeOutMins * 60 * 1000);
connPool.setTestOnBorrow(true);
connPool = new InstrumentedObjectPool(extractServerName(connectionUrl),
connPool);
String connectionValidationSql = "SELECT 1;";
KeyedObjectPoolFactory preparedStatementPool = null;
Boolean defaultConnectionsToReadOnly = false;
Boolean defaultConnectionsToAutoCommit = false;
TransactionManager transactionManager;
try {
transactionManager = (TransactionManager)
InitialContext.doLookup("java:/TransactionManager");
} catch (NamingException e) {
throw new RuntimeException("Unable to lookup transaction manager",
e);
}
LocalXAConnectionFactory transactionFactory = new
LocalXAConnectionFactory(transactionManager,
connectionFactory);
// Create factory to manage the connectionPool
PoolableManagedConnectionFactory poolableConnectionFactory = new
PoolableManagedConnectionFactory(
transactionFactory, connPool, preparedStatementPool,
connectionValidationSql,
defaultConnectionsToReadOnly, defaultConnectionsToAutoCommit);
ManagedDataSource dataSource = new ManagedDataSource(connPool,
transactionFactory.getTransactionRegistry());
return dataSource;
{code}
Using these in combination will give you a transactionally aware EMF with connection
pooling.
--------------------------------------------------------------
Reply to this message by going to Community
[
http://community.jboss.org/message/624249#624249]
Start a new discussion in Datasource Configuration at Community
[
http://community.jboss.org/choose-container!input.jspa?contentType=1&...]