2016-08-30 17 views
1

現在、既存のソリューションを置き換えるためのRESTサービスを開発中です。私はプレーンなPayara/JEE7/JAX-RSを使っています。私は春を使用していないし、私は意図していない。JEE7/JAX-RS JDBC接続プールをプログラムで作成する方法

私が直面している問題は、できるだけ元の構成(構成ファイルを制御する人形を持つクラスタ内の複数のノードに展開)を再利用したいということです。

<persistence-unit name="myDatabase"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>jdbc/pgsql</jta-data-source> 
    <properties> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/> 
     <!-- bla --> 
    </properties> 
</persistence-unit> 

<jdbc-connection-pool driver-classname="" pool-resize-quantity="10" datasource-classname="org.postgresql.ds.PGSimpleDataSource" max-pool-size="20" res-type="javax.sql.DataSource" steady-pool-size="10" description="" name="pgsqlPool"> 
    <property name="User" value="some_user"/> 
    <property name="DatabaseName" value="myDatabase"/> 
    <property name="LogLevel" value="0"/> 
    <property name="Password" value="some_password"/> 
<!-- bla ---> 
</jdbc-connection-pool> 
<jdbc-resource pool-name="pgsqlPool" description="" jndi-name="jdbc/pgsql"/> 

はまた、あなたがこのようなあなたのアーカイブ内のpersistence.xmlファイルを持っていると思います: 通常はGlassfish /ペーシュ・カショーロに、あなたはこのようないくつかのコンテンツを持つdomain.xmlファイルを持っていると思います

これらの設定ファイルをプログラム的なソリューションで置き換える必要があるため、既存の従来の設定ファイルから読み込み、必要に応じてサーバの起動時に接続プールと永続ユニットを作成できます。

これを達成する方法はありますか?

答えて

0

1つのアプリケーションを実行するドッキングサーバーを使用することを目標にしているため、組み込みサーバーを使用することができます。 埋め込まれたサーバを使用して、私の問題を解決するには、おおよそ次のようになります。

サーバープロジェクトの場合は、Mavenの依存関係を作成します。

<dependencies> 
    <dependency> 
     <groupId>fish.payara.extras</groupId> 
     <artifactId>payara-embedded-all</artifactId> 
     <version>4.1.1.163.0.1</version> 
    </dependency> 
</dependencies> 
は次のようにサーバーを起動し

final BootstrapProperties bootstrapProperties = new BootstrapProperties(); 
final GlassFishRuntime runtime = GlassFishRuntime.bootstrap(); 
final GlassFishProperties glassfishProperties = new GlassFishProperties(); 
final GlassFish glassfish = runtime.newGlassFish(glassfishProperties); 
glassfish.start(); 

開始されたインスタンスに接続プールを追加します。

final CommandResult createPoolCommandResult = commandRunner.run("create-jdbc-connection-pool", 
    "--datasourceclassname=org.postgresql.ds.PGConnectionPoolDataSource", "--restype=javax.sql.ConnectionPoolDataSource", // 
    "--property=DatabaseName=mydb"// 
     + ":ServerName=127.0.0.1"// 
     + ":PortNumber=5432"// 
     + ":User=myUser"// 
     + ":Password=myPassword"// 
     //other properties 
    , "Mydb"); //the pool name 

に対応するJDBCリソースを追加します。

final CommandResult createResourceCommandResult = commandRunner.run("create-jdbc-resource", "--connectionpoolid=Mydb", "jdbc__Mydb"); 

(現実の世界ではあなたには、いくつかの外部のコンフィギュレーション・ファイルからデータを取得します)

は、今すぐあなたのアプリケーションをデプロイ:

glassfish.getDeployer().deploy(new File(pathToWarFile)); 

(通常はあなたが考え

アプリケーション自体では、次のように構成されたプールを参照することができます。

@PersistenceContext(unitName = "mydb") 
EntityManager mydbEm; 

完了。

glassfish-resources.xmlも可能でしたが、キャッチがあります:私の設定ファイルは外部で、一部のアプリケーションで共有されているため(ファイル形式は私のものではありません)、展開時に外部ツールによって作成されます。ファイルをglassfish-resources.xmlファイルにXSLTし、 "asadmin"呼び出しを行うスクリプトを実行する必要があります。

組み込みサーバーを実行することは、私がCIサーバー上で簡単に構築できるオールジャワのソリューションであり、アプリケーションのテストスイートは、同じ組み込みサーバービルドをスピンアップして統合テストを実行できます。

0

実際には、各domain.xmlを手動で編集する必要はありません。ただ、このようなのglassfish-resources.xmlファイルを作成:次に

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"> 
<resources> 
<jdbc-connection-pool driver-classname="" pool-resize-quantity="10" datasource-classname="org.postgresql.ds.PGSimpleDataSource" max-pool-size="20" res-type="javax.sql.DataSource" steady-pool-size="10" description="" name="pgsqlPool"> 
    <property name="User" value="some_user"/> 
    <property name="DatabaseName" value="myDatabase"/> 
    <property name="LogLevel" value="0"/> 
    <property name="Password" value="some_password"/> 
<!-- bla ---> 
</jdbc-connection-pool> 
<jdbc-resource pool-name="pgsqlPool" description="" jndi-name="jdbc/pgsql"/> 
</resources> 

をどちらかに一度、各ノードで

$PAYARA_HOME/bin/asadmin add-resources glassfish-resources.xml 

を使用するか、下に置くWEB-INF /この場合、JNDIであなたの戦争(ノート、の-nameは、java:app/jdbc/pgsqlでなければならない(SHOULD)。

persistence.xmlは、クラスパス内の任意のjarのMETA-INF /の下にある必要があります。

あなたがこれを好きではない場合は、その場でEntityManagerを作成するために

@PersistenceUnit(unitName = "MyDatabase") 
EmtityManagerFactory emf; 

を使用することがあります。

createEntityManager(java.util.Map properties). 

ところで、あなたはクラスタ全体でJCacheので設定を共有することができペーシュ・カショーロを使用。

+0

本当に私の質問には答えてくれませんが、情報をありがとう。ただし、asadminスクリプトはインストールスクリプトの一部として実行できるので、「回避策」として役立つかもしれません。 ノードごとにwarファイルを構築せずに、同じアプリケーションを異なるノードに異なる設定(データベースアドレス)で展開する必要があるため、warファイルの一部として何かを追加することはできません。 – Brixomatic

+0

また、Runtime.exec(...)を使用してアプリケーションを起動するasadminを初めて実行することも考えられます。 com.sun.aas.installRootプロパティを使用してasadminを見つけることができます。 –