如何从子 EJB 项目中找到数据源?
How can I find datasource from child EJB project?
同样的事情在 Liberty 中工作得很好,但我必须让它工作
使用 WebSphere 8.0...
我有一个 EAR > WAR > EJB 项目结构的应用程序。这
想法是使用 RESTful 触发器启动批处理
WAR,它使用 EJB 中的逻辑来执行任务。我有一个
EJB 项目中的持久性帮助器被注入
EntityManager,一切顺利。
JPA 对于我需要注入的数据和容量来说太慢了,所以
我们决定使用 JDBC 批处理导入数据
过程,所以我需要一个数据源。它在服务器控制台中定义
(persistence.xml 将它用于 JPA),我在 web.xml 中定义了它
和 ibm-web-bnd.xml,但我似乎仍然找不到它。此外,如果
我有一个class在WAR吐出来的JNDI树,我可以在下面看到
java:comp/env/jdbc/MyDB,但与 EJB 中的 class 不同
树.
web.xml:
<resource-ref>
<res-ref-name>jdbc/MyDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<mapped-name>jdbc/MyDB</mapped-name>
</resource-ref>
ibm-web-bnd.xml:
<resource-ref name="jdbc/MyDB" binding-name="jdbc/MyDB" />
MyPersistence.java:
@Resource(name="jdbc/MyDB")
private DataSource datasource;
我是否需要一些额外的东西来将数据源向下传递到 EJB 级别?这看起来很奇怪,因为 EntityManager 正在成功使用它。
一如既往,我们将不胜感激!
Post-答案编辑:
根据 Gas 的回答,这是我需要添加到 ibm-ejb-jar-bnd.xml 的条目:
<session name="MyPersistence" simple-binding-name="com.travelers.bi.errordb.persistence.MyPersistence">
<resource-ref name="jdbc/MyDB" binding-name="jdbc/MyDB" />
</session>
将数据源的 @Resource
注释添加到您的 EJB class(与将其添加到 MyPersistence
class 的方式相同),然后创建 ibm-ejb-jar-bnd.xml
文件与您的 ibm-web-bnd.xml
文件具有类似的资源引用绑定。
关于 EJB 绑定文件 - 区别在于 ibm-web-bnd.xml
文件用于 Web 模块中使用的资源,如 servlet 等。从 Java EE 7 开始,您可以将 EJB 嵌入 Web模块,但它们仍然使用自己的 annotations/deployment 描述符作为引用,这就是为什么你有单独的 EJB 绑定文件。
同样的事情在 Liberty 中工作得很好,但我必须让它工作 使用 WebSphere 8.0...
我有一个 EAR > WAR > EJB 项目结构的应用程序。这 想法是使用 RESTful 触发器启动批处理 WAR,它使用 EJB 中的逻辑来执行任务。我有一个 EJB 项目中的持久性帮助器被注入 EntityManager,一切顺利。
JPA 对于我需要注入的数据和容量来说太慢了,所以 我们决定使用 JDBC 批处理导入数据 过程,所以我需要一个数据源。它在服务器控制台中定义 (persistence.xml 将它用于 JPA),我在 web.xml 中定义了它 和 ibm-web-bnd.xml,但我似乎仍然找不到它。此外,如果 我有一个class在WAR吐出来的JNDI树,我可以在下面看到 java:comp/env/jdbc/MyDB,但与 EJB 中的 class 不同 树.
web.xml:
<resource-ref>
<res-ref-name>jdbc/MyDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
<mapped-name>jdbc/MyDB</mapped-name>
</resource-ref>
ibm-web-bnd.xml:
<resource-ref name="jdbc/MyDB" binding-name="jdbc/MyDB" />
MyPersistence.java:
@Resource(name="jdbc/MyDB")
private DataSource datasource;
我是否需要一些额外的东西来将数据源向下传递到 EJB 级别?这看起来很奇怪,因为 EntityManager 正在成功使用它。
一如既往,我们将不胜感激!
Post-答案编辑:
根据 Gas 的回答,这是我需要添加到 ibm-ejb-jar-bnd.xml 的条目:
<session name="MyPersistence" simple-binding-name="com.travelers.bi.errordb.persistence.MyPersistence">
<resource-ref name="jdbc/MyDB" binding-name="jdbc/MyDB" />
</session>
将数据源的 @Resource
注释添加到您的 EJB class(与将其添加到 MyPersistence
class 的方式相同),然后创建 ibm-ejb-jar-bnd.xml
文件与您的 ibm-web-bnd.xml
文件具有类似的资源引用绑定。
关于 EJB 绑定文件 - 区别在于 ibm-web-bnd.xml
文件用于 Web 模块中使用的资源,如 servlet 等。从 Java EE 7 开始,您可以将 EJB 嵌入 Web模块,但它们仍然使用自己的 annotations/deployment 描述符作为引用,这就是为什么你有单独的 EJB 绑定文件。