0

我目前正在尝试将部分 SELECT 查询从主数据库移动到我们的只读副本。这些查询主要用于统计信息和类似的东西,并且如上所述都是只读的。

我将副本数据库添加到我的 application.conf 中,并修改了要使用的查询

JPA.getJPAConfig("replica").getJPAContext().em().createNativeQuery(query)

每次我在复制品上打电话时,玩!给我以下错误:

JPA error
A JPA error occurred (No JPAConfig is found with the name replica)

我发现防止此错误的唯一方法是在其上添加一些带有 @PersistenceUnit(name="replica") 的无用类,以强制为副本创建 JPA conf。

我确实相信这更像是一个肮脏的黑客而不是一个干净的修复,并且由于副本数据库是只读的,因此在其上创建新表,即使是空的也很烦人。

如果有人找到解决此问题的另一种方法,我会很高兴听到它!

祝你早/晚/午/晚愉快!

4

1 回答 1

0

我想出了另一种解决方法,仍然不完美,但没有以前那么混乱。

这个想法是使用

DB.getDBConfig("replica").executeQuery(query) 

代替

JPA.getJPAConfig("replica").getJPAContext().em().createNativeQuery(query)

如果您已经有一些代码期望I made a quick function to transform the List<Object[]>output of createNativeQuery(query).getResultList();I made a quick function to transform the ResultSetyou now receive :

public static List<Object[]> formatResult(ResultSet rs) {
    List<Object[]> resultList = new ArrayList<Object[]>();
    try {
        while(rs.next()) {
            Object[] array = new Object[rs.getMetaData().getColumnCount()];
            for (int i = 0; i < array.length; i++) {
                array[i] = rs.getObject(i+1);
            }
            resultList.add(array);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return resultList;
} 

我仍在对要交换到副本数据库的整个代码部分测试此功能,如果出现任何问题,我将进行更新。

于 2013-06-04T12:49:43.653 回答