Java 使用数据源记录查询的最佳方法
我需要在数据库中记录或写入查询选择、更新、插入、删除已登录用户到数据库。我在网上看到过一些教程,但它们不包括这个案例。我需要将查询记录到数据源,但还需要在记录到应用程序JSF的会话中附加用户的名称。我怎么做 我使用的是EntityManager,而不是Hibernate会话。自定义JPA提供程序LoggingClass 如果要记录任何sql查询,请执行以下操作: 只需按照所选JPA提供商的说明来实现自定义日志记录。通过这种方式,您可以将用户添加到日志条目-> PS:别忘了在persistence.xml中将日志记录级别设置为FINE,这将为任何查询启用SQL日志记录 倒退 如果您只想记录EJB逻辑: 我在以前的一个项目中使用了,它是从log4j构建的。设置起来很容易。只需遵循规则 可以在LOGBack.xml中定义magic LOGBack正在执行的操作: 转换器类:Java 使用数据源记录查询的最佳方法,java,mysql,jpa,wildfly,audit,Java,Mysql,Jpa,Wildfly,Audit,我需要在数据库中记录或写入查询选择、更新、插入、删除已登录用户到数据库。我在网上看到过一些教程,但它们不包括这个案例。我需要将查询记录到数据源,但还需要在记录到应用程序JSF的会话中附加用户的名称。我怎么做 我使用的是EntityManager,而不是Hibernate会话。自定义JPA提供程序LoggingClass 如果要记录任何sql查询,请执行以下操作: 只需按照所选JPA提供商的说明来实现自定义日志记录。通过这种方式,您可以将用户添加到日志条目-> PS:别忘了在persistence
public class UserConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent event) {
//somehow get your logged in user from the current session:
UserAccount currentUser = Util.getUserAccount();
if (currentUser != null) {
return currentUser.getLogin();
}
return "NO_USER";
}
}
最后,您只需记录EJB类中的每个EJB事务:
public class SomeEJB {
@PersistenceContext(
unitName = "SOME_UNITNAME",
type = PersistenceContextType.TRANSACTION
)
protected EntityManager em;
protected Logger log;
@PostConstruct
private void init() {
log = LoggerFactory.getLogger(this.getClass());
}
public <T> T update(T o) {
log.info("update: " + o.toString());
return em.merge(o);
}
.
.
.
}
祝你伐木愉快 一种解决方案是通过JDBC驱动程序使用代理,并从您的ThreadLocal上下文中获取用户名。不,它不起作用,因为我还想记录到数据库中。所以我认为最好的方法是记录查询。或者参数。刚刚编辑了我的答案。只需为您的JPA提供商创建一个自定义记录器,就可以了。只需按照我答案中链接中的说明进行操作。
public class UserConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent event) {
//somehow get your logged in user from the current session:
UserAccount currentUser = Util.getUserAccount();
if (currentUser != null) {
return currentUser.getLogin();
}
return "NO_USER";
}
}
public class SomeEJB {
@PersistenceContext(
unitName = "SOME_UNITNAME",
type = PersistenceContextType.TRANSACTION
)
protected EntityManager em;
protected Logger log;
@PostConstruct
private void init() {
log = LoggerFactory.getLogger(this.getClass());
}
public <T> T update(T o) {
log.info("update: " + o.toString());
return em.merge(o);
}
.
.
.
}