2014-11-21 86 views
1

我使用的GlassFish 4和Java EE 7,我需要定义一个连接池是为每个应用程序,我将在GlassFish中部署不同的定义不同的连接池。如何通过部署的应用程序在GlassFish中

我有每个客户端一个应用程序(.war文件),并且每个客户都有自己的用户名/密码/模式在我的MySQL数据库,这样数据就不是客户端之间共享。 我知道如何在glassfish中定义连接池,但是我的所有应用程序只能使用相同的设置(我正在使用bonecp btw)。 我希望能够为每个部署的应用程序更改用户/密码/架构。是否有可能在persistence.xml中完全定义连接池而不是在glassfish中,所以我可以在不同的.war文件中有不同的连接池? 随着10个.war文件的部署(10个客户端),我想有10个不同的连接池(不同的用户/密码/架构定义)。

回答

0

如果以编程方式创建数据源,那么您可以将其注入到JPA没有必要宣布它在你的persistence.xml。下面是一个例子

定义持久性的XML:

<persistence-unit name="foo-PU" transaction-type="RESOURCE_LOCAL"> 
    <!-- the provider: Hibernate, EclipseLink or another --> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 

    <!-- No need to define any connection parameter nor the data source --> 

    <!-- class definitions here --> 
</persistence-unit> 

定义属性文件来存储数据源的配置:

db.driver=com.mysql.jdbc.Driver 
db.url=jdbc:mysql://localhost:3306/foo_db 
db.user=user 
db.password=s3cr3t 
db.bonecp.idleConnectionTestPeriod=60 
db.bonecp.idleMaxAge=240 
db.bonecp.maxConnections=10 
# more properties... 

定义类,将生成的数据源

public class DataSourceGenerator { 
    public static DataSource getDataSource(String properties) { 
     Properties conf = new Properties(); 
     try { 
      conf.load(
       DataSourceFactory.class 
       .getClassLoader().getResourceAsStream(
        properties)); 
     } catch (IOException e) { 
      //handle the error 
      //naive handling shown here 
      e.printStacktrace(); 
     } 
     BoneCPDataSource dataSource = new BoneCPDataSource(); 
     //set the properties from the .properties file 
     dataSource.setDriverClass(conf.getProperty("db.driver")); 
     dataSource.setJdbcUrl(conf.getProperty("db.url")); 
     dataSource.setUsername(conf.getProperty("db.user")); 
     dataSource.setPassword(conf.getProperty("db.password")); 
     dataSource.setIdleConnectionTestPeriodInMinutes(
      Long.parseLong(
       conf.getProperty("db.bonecp.idleConnectionTestPeriod"))); 
     dataSource.setIdleMaxAgeInSeconds(
      Long.parseLong(
       conf.getProperty("db.bonecp.idleMaxAge"))); 
     dataSource.setMaxConnectionsPerPartition(
      Integer.parseInt(
       conf.getProperty("db.bonecp.maxConnections"))); 
     //more properties to load... 
     return dataSource; 
    } 
} 

以编程方式创建您的EntityManagerFactory以及:

public class EntityManagerFactoryGenerator { 
    public static EntityManagerFactory createEMF() { 
     Map<String, Object> properties = new HashMap<>(); 
     String dataSourceKey = ""; 
     //uncomment here depending on your needs... 
     //using Hibernate 
     //dataSourceKey = org.hibernate.cfg.AvailableSettings.DATASOURCE; 
     //using EclipseLink 
     //dataSourceKey = org.eclipse.persistence 
     // .config.PersistenceUnitProperties.NON_JTA_DATASOURCE; 
     properties.put(
      dataSourceKey, 
      DataSourceGenerator.getDataSource("mysql-con.properties")); 
     return Persistence.createEntityManagerFactory("foo-PU", properties); 
    } 
} 
0

第1步。转到Glassfish管理控制台来配置JDBC连接详细信息。

内部资源 - JDBC为每一个组连接一个细节池,然后创建一个JDBC数据源到每个创建的池。

步骤2.进入每个应用程序,并指向正确的数据源的持久化文件。

不要指定供应商,如果你不需要任何特殊的Glassfish附带一个的EclipseLink已经,工作正常。

相关问题