带 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】:

这意味着在使用 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的主要内容,如果未能解决你的问题,请参考以下文章

3JDBC-API

廖雪峰Java15JDBC编程-3JDBC接口-2JDBC查询

廖雪峰Java15JDBC编程-3JDBC接口-2JDBC更新

Mysql3jdbc:DriverManager.getConnection(url, user, pwd)

关于jdbc.properties配置文件的参数说明

如何在 JPA 2 实体中映射 postgresql“带有时区的时间戳”