0

現在、SELECT クエリの一部をメイン DB から読み取り専用レプリカに移動しようとしています。これらのクエリは主に統計などに使用され、前述のようにすべて読み取り専用です。

application.conf にレプリカ データベースを追加し、使用するクエリを変更しました。

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

レプリカに電話をかけるたびに、Play! 次のエラーが表示されます:

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

このエラーを防ぐために私が見つけた唯一の方法は、その上に @PersistenceUnit(name="replica") を含む役に立たないクラスを追加して、レプリカの JPA conf の作成を強制することです。

これはきれいな修正というよりも、汚いハックだと思います。レプリカ DB は読み取り専用であり、その上に新しいテーブルを作成しているため、空であっても非常に面倒です。

誰かがこの問題を解決する別の方法を見つけた場合は、それについて聞いて本当にうれしいです!

良い朝/夕方/午後/夜をお過ごしください。

4

1 に答える 1

0

別の回避策を見つけましたが、まだ完全ではありませんが、以前よりも面倒ではありません。

アイデアは、使用することです

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

それ以外の

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

I made a quick function to transform の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;
} 

レプリカ DB にスワップされるコード全体でこの関数をまだテストしています。問題が発生した場合は更新します。

于 2013-06-04T12:49:43.653 に答える