带 JDBC 的 EJB 3
Posted
技术标签:
【中文标题】带 JDBC 的 EJB 3【英文标题】:EJB 3 with JDBC 【发布时间】:2009-09-27 03:38:09 【问题描述】:是否可以将 EJB 3 与 JDBC 一起使用。我在某处读到,这是允许的。
但是,我听说 EJB 3 实现默认使用 JTA。这对 JDBC 意味着什么?只是为了交易支持吗?这意味着在使用 JDBC 代码时使用 JTA 进行事务处理?这意味着即使是本地事务也被实现为全局事务?
这是否意味着将 JDBC 与 EJB 3 一起使用不是一个好主意?许多人将我指向 JPA,但它是一个 ORM。我想使用 SQL。
有什么建议吗?
【问题讨论】:
为什么要使用 EJB3?您是否将其与从 Spring Framework 中获得的内容进行了比较?您将使用哪个版本的 J2EE? Websphere 7 附带的 Java EE5 实现。Spring DAO - 简单的 JDBC 模板似乎不错。事实上,我们只使用一个数据源,它的所有本地事务。给出这个架构的人认为 Spring 在 J2EE 和 Tomcat 等非应用服务器之外的价值主张为零。 【参考方案1】:1º
这意味着在使用 JDBC 代码时 JTA 用于事务?
和
意味着即使是本地事务也被实现为全局事务?
EJB 容器可以利用资源管理器本地事务作为不需要分布式事务的企业 bean 的优化技术。
在使用声明式或编程式事务划分时,最好执行以下操作:
使用企业 bean 类中的 Resource 注释或使用企业 bean 的部署描述符中的 resource-ref 元素声明资源类似(setter 方法或成员字段)
// mappedName points to a global mapping name
@Resource(mappedName="java:/DefaultDS")
private javax.sql.DataSource ds;
在业务逻辑方法内部
如果您使用的是声明式事务
连接连接 = ds.getConnection();
如果您使用的是程序化事务
声明一个setter或成员字段UserTransaction
@Resource
private UserTransaction ut;
和
ut.beginTransaction();
Connection conn = ds.getConnection();
ut.commit();
注意以下事项
如果您使用的是有状态会话 bean,请在 PrePassivate 回调方法中执行以下操作
在 PrePassivate 方法中关闭所有 JDBC 连接,并将存储连接的实例字段分配为 null问候,
【讨论】:
很好的答案,谢谢。当您说“EJB 容器可以利用资源管理器本地事务作为不需要分布式事务的企业 bean 的优化技术”时,这是否意味着这是由 EJB 3 容器自动完成的?这是 JEE 标准要求还是某些供应商提供的功能?如果它是一项功能,那么它是可配置的还是通常默认以这种方式完成? @Shaw 嗨,虽然不是要求,但 JEE 规范允许在不需要分布式事务时使用它。检查您的 JEE 实现是否在不需要分布式事务时使用资源管理器本地事务。 这是否意味着这是由 EJB 3 容器自动完成的? EJB 容器可以自动完成,但再次查看它的文档是个好主意。【参考方案2】:你可以看看这个页面,看起来你可以将 EJB3 与 JDBC 结合起来。
http://www.java2s.com/Tutorial/Java/0415__EJB3/UseJDBCInEJB.htm
【讨论】:
【参考方案3】:如果您使用的是 JPA2,您可以使用 entityManager.unwrap(Connection.class)
获取实际连接并与您的 JDBC 代码一起使用。
例如:
Connection connection = entityManager.unwrap( Connection.class );
try (Statement stmt = connection.createStatement())
stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'my name' ) " );
这是否意味着将 JDBC 与 EJB 3 一起使用不是一个好主意?很多人 指向我JPA,但它是一个ORM。我想使用 SQL。
有时出于性能或兼容性问题需要。我通常使用这种技术来执行带有数组参数、复杂 Posgis SQL 等的 PL/PSQL。
【讨论】:
以上是关于带 JDBC 的 EJB 3的主要内容,如果未能解决你的问题,请参考以下文章
廖雪峰Java15JDBC编程-3JDBC接口-2JDBC查询
廖雪峰Java15JDBC编程-3JDBC接口-2JDBC更新