Eclipse persistence与DB2:如何通过QueryHint为JPA查询添加With UR?
解决EclipseLink JQL添加
WITH UR的方法 WITH UR是DB2专属的无锁读语法,用来避免查询时的锁定问题,用EclipseLink实现的话,给你几个靠谱的方案:
1. 用DB2专属查询提示
EclipseLink针对DB2做了适配,直接加这个提示就行:
query.setHint("eclipselink.jdbc.property", "DB2IsolationLevel=UR");
要是这个不行,也可以试试标准隔离级别提示,部分DB2驱动会把READ_UNCOMMITTED映射成WITH UR:
query.setHint(QueryHints.JDBC_ISOLATION_LEVEL, Connection.TRANSACTION_READ_UNCOMMITTED);
2. 直接在JQL里拼WITH UR(简单粗暴但有效)
如果提示不管用,直接写JQL的时候加上就行,比如:
String jql = "SELECT e FROM Entity e WHERE e.status = :status WITH UR"; Query query = em.createQuery(jql);
缺点就是和DB2绑定死了,换数据库得改代码,不过应急用挺方便。
3. 全局配置SQL转换器(适合全项目生效)
要是整个项目的读查询都要加WITH UR,可以写个自定义SQL转换器,自动给生成的SQL加后缀:
public class DB2WithURSQLConverter extends DefaultSQLConverter { @Override public String convertSelectCriteria(DatabaseQuery query, SQLSelectStatement statement) { String sql = super.convertSelectCriteria(query, statement); // 只给读查询加WITH UR,避免影响写操作 if (query.isReadQuery() && !sql.contains("WITH UR")) { return sql + " WITH UR"; } return sql; } }
然后在persistence.xml里配置这个转换器:
<property name="eclipselink.sql.converter" value="com.yourpackage.DB2WithURSQLConverter"/>
额外提醒
- 确保用的是EclipseLink 2.7及以上版本,旧版本可能不支持这些提示;
- 检查DB2驱动版本,有些老驱动对隔离级别的映射有问题;
- 要是用Spring Data JPA,直接在方法上加
@QueryHints注解就行:
@QueryHints({ @QueryHint(name = "eclipselink.jdbc.property", value = "DB2IsolationLevel=UR") }) List<Entity> findByStatus(String status);
内容的提问来源于stack exchange,提问作者mikeb
相关产品推荐
相关产品推荐

