Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用数据源记录查询的最佳方法_Java_Mysql_Jpa_Wildfly_Audit - Fatal编程技术网

Java 使用数据源记录查询的最佳方法

Java 使用数据源记录查询的最佳方法,java,mysql,jpa,wildfly,audit,Java,Mysql,Jpa,Wildfly,Audit,我需要在数据库中记录或写入查询选择、更新、插入、删除已登录用户到数据库。我在网上看到过一些教程,但它们不包括这个案例。我需要将查询记录到数据源,但还需要在记录到应用程序JSF的会话中附加用户的名称。我怎么做 我使用的是EntityManager,而不是Hibernate会话。自定义JPA提供程序LoggingClass 如果要记录任何sql查询,请执行以下操作: 只需按照所选JPA提供商的说明来实现自定义日志记录。通过这种方式,您可以将用户添加到日志条目-> PS:别忘了在persistence

我需要在数据库中记录或写入查询选择、更新、插入、删除已登录用户到数据库。我在网上看到过一些教程,但它们不包括这个案例。我需要将查询记录到数据源,但还需要在记录到应用程序JSF的会话中附加用户的名称。我怎么做

我使用的是EntityManager,而不是Hibernate会话。

自定义JPA提供程序LoggingClass 如果要记录任何sql查询,请执行以下操作:

只需按照所选JPA提供商的说明来实现自定义日志记录。通过这种方式,您可以将用户添加到日志条目->

PS:别忘了在persistence.xml中将日志记录级别设置为FINE,这将为任何查询启用SQL日志记录

倒退 如果您只想记录EJB逻辑:

我在以前的一个项目中使用了,它是从log4j构建的。设置起来很容易。只需遵循规则

可以在LOGBack.xml中定义magic LOGBack正在执行的操作:

转换器类:

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);
    }
    
    .
    .
    .
}