2016-12-15 49 views
1

我目前有一个应用程序,它使用JBoss来启动服务并使用焊接来管理EJB。当它开始使用自定义类的持久性单元管理器时,@EJB注释以及服务都是空的并且没有被调用。有没有办法设置一个命令来强制服务在持久单元之前启动?在JBoss Weld中开始服务持久性单元服务

+0

您是否有一些代码来说明您的问题? –

+0

并不特别。这里演示很复杂,需要更多的配置。服务具有标准@ startup和@ singleton。所有其他的魔法都是由我没有代码的jboss处理的。对hibernate和postgres使用标准persistance.xml。 – user3170736

+0

所以第一个问题什么是持久性单元管理器? –

回答

2

我建议在JBoss应用服务器中配置JTA数据源,这样你就可以监测池中的连接对象及其使用情况。

复制在standalone.xml这里面的数据源子系统: 注意:您需要在使用该数据源之前注册供应商数据库服务器的JDBC驱动程序。

Adding Database Driver in JBoss and Wildfly.

<datasource jta="true" jndi-name="java:/datasource/YOUR_APPLICATION_NAME" pool-name="YOUR_APPLICATION_NAME" enabled="true" use-ccm="true" statistics-enabled="true"><!--JNDI Name which will be used in your persistence.xml in your applicaton--> 
        <connection-url>jdbc:mysql://server-ip-here:3306/your-database-name</connection-url><!-- change according to your database--> 
        <driver-class>com.mysql.jdbc.Driver</driver-class><!-- change according to your database--> 
        <connection-property name="zeroDateTimeBehavior"> 
         convertToNull 
        </connection-property> 
        <driver>mysql</driver><!-- change according to your database--> 
        <new-connection-sql>SELECT 1</new-connection-sql> 
        <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation> 
        <pool> 
         <min-pool-size>3</min-pool-size> 
         <initial-pool-size>3</initial-pool-size> 
         <max-pool-size>5</max-pool-size> 
         <prefill>true</prefill> 
         <flush-strategy>FailingConnectionOnly</flush-strategy> 
        </pool> 
        <security> 
         <user-name>db-user-name</user-name> 
         <password>db-user-password</password> 
        </security> 
        <validation> 
         <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"/><!-- change according to your database--> 
         <check-valid-connection-sql>SELECT 1</check-valid-connection-sql> 
         <validate-on-match>true</validate-on-match> 
         <background-validation>false</background-validation> 
         <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"/><!-- change according to your database--> 
        </validation> 
        <timeout> 
         <blocking-timeout-millis>6000</blocking-timeout-millis> 
         <idle-timeout-minutes>30</idle-timeout-minutes> 
         <query-timeout>60</query-timeout> 
         <allocation-retry>4</allocation-retry> 
         <allocation-retry-wait-millis>200</allocation-retry-wait-millis> 
        </timeout> 
        <statement> 
         <track-statements>true</track-statements> 
        </statement> 
       </datasource> 

src/main/java/resources/META-INF/persistence.xml文件应该是这样的:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="myAppPu" transaction-type="JTA"> 
     <description>Persistence Unit for MyApp Database</description> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>jdbc:mysql://server-ip-here:3306/your-database-name</jta-data-source><!--This is already defined in newly created datasource--> 

     !--<validation-mode>CALLBACK</validation-mode>--> 
     <properties> 
      <property name="javax.persistence.schema-generation.create-database-schemas" value="false" /> 
      <property name="javax.persistence.schema-generation.database.action" value="none" /> 
      <property name="hibernate.show_sql" value="true"></property> 
      <property name="hibernate.format_sql" value="false"></property> 
      <property name="use_sql_comments" value="false" /> 
      <property name="hibernate.archive.autodetection" value="class"></property> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"></property> 
      <!-- Hibernate Envers --> 
      <!--<property name="hibernate.auditable" value="false" />--> 
     </properties> 
    </persistence-unit> 
</persistence> 

现在,你准备在你的应用程序中使用的EntityManager。 用法示例:

@Stateless 
public class MyEjbServiceImpl implements MyEjbService { 

    @PersistenceContext(unitName = "myAppPu") //this should match with unitname defined in persistence.xml 
    private EntityManager em; 

}