玩!不在只读副本上创建JPA配置

时间:2013-06-04 07:40:17

标签: java jpa playframework

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

我在我的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。

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

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

早上/晚上/下午/晚上好!

1 个答案:

答案 0 :(得分:0)

我想出了另一个解决方法,仍然不完美,但比以前更不凌乱。

想法是使用

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

而不是

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

如果您已经有一些代码需要List<Object[]>输出createNativeQuery(query).getResultList();,我会快速转换您现在收到的ResultSet

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

我仍然在我们的代码的整个部分上测试这个函数,这些代码正在转移到副本数据库,如果出现任何问题,我会更新。