カスタムデータベース同期
2564 ワード
機能として、Web側のデータベースで現在のユーザーに関連するデータをモバイルデバイス側に同期する必要があります.モバイルデバイス側は、ネットワークに接続されている場合にデータをタイミングよく同期し、ネットワークに接続されていない場合に古いデータを照会することができます.
解決策は次のとおりです.
1.初期状態のWeb側データベースが空であると仮定します.ユーザーは、データの記録中にアクションをログ・テーブルに記録します.
2.モバイルデバイス側でスレッドを起動し、ログ・テーブルに定期的にアクセスします.自分に関する最新の変更記録を取得します.
3.これらの変更をローカルSQLiteに更新する
技術への使用:
1.ユーザのすべての操作をHibernate Listenerで記録する.関心テーブルの操作をログテーブルに記入します.ログ・テーブルには、アクション・タイプ(insert update delete)、アクション・テーブル名、レコードID、およびオペレータが含まれます.
2.Hibernate Listenerにサーブレットがなく、現在のオペレータの情報を取得できません.だからThreadLocalを使う
いくつかの疑問:
1.aspectJでSessionクラスを切り取り、データベース操作ログを記録するつもりだった.aspectJがSessionで接面するコードが実行されないことが分かった.原因は不明ですが、hibernate動的生成コードと関係がある可能性があります.
解決策は次のとおりです.
1.初期状態のWeb側データベースが空であると仮定します.ユーザーは、データの記録中にアクションをログ・テーブルに記録します.
2.モバイルデバイス側でスレッドを起動し、ログ・テーブルに定期的にアクセスします.自分に関する最新の変更記録を取得します.
3.これらの変更をローカルSQLiteに更新する
技術への使用:
1.ユーザのすべての操作をHibernate Listenerで記録する.関心テーブルの操作をログテーブルに記入します.ログ・テーブルには、アクション・タイプ(insert update delete)、アクション・テーブル名、レコードID、およびオペレータが含まれます.
2.Hibernate Listenerにサーブレットがなく、現在のオペレータの情報を取得できません.だからThreadLocalを使う
いくつかの疑問:
1.aspectJでSessionクラスを切り取り、データベース操作ログを記録するつもりだった.aspectJがSessionで接面するコードが実行されないことが分かった.原因は不明ですが、hibernate動的生成コードと関係がある可能性があります.
public class HibernateHistoryListener implements PostInsertEventListener,
PostUpdateEventListener, PostDeleteEventListener {
static final Class accessClass[] = { DmMenu.class, DmRMenuDish.class,
DmCategory.class, DmDish.class, DmDishImage.class, DmEvaluate.class };
public final static ThreadLocal userLocal = new ThreadLocal();
public void onPostInsert(PostInsertEvent arg) {
log("insert", arg.getEntity(), arg.getId().toString(), arg.getSession());
}
public void onPostUpdate(PostUpdateEvent arg) {
log("update", arg.getEntity(), arg.getId().toString(), arg.getSession());
}
public void onPostDelete(PostDeleteEvent arg) {
log("delete", arg.getEntity(), arg.getId().toString(), arg.getSession());
}
private void log(String method, Object obj, String id, Session session) {
boolean access = false;
for (int i = 0; i < accessClass.length; i++) {
Class array_element = accessClass[i];
if (obj.getClass().equals(array_element)) {
access = true;
break;
}
}
if (!access) {
return;
}
DmOperationLog log = new DmOperationLog();
log.setOperationName(method);
log.setOperationTime(new Date());
log.setRecordId(id);
log.setTargetName(obj.getClass().toString());
log.setDmUser((DmUser) userLocal.get());
Session temp = session.getSessionFactory().openSession();
Transaction tx = null;
try {
tx = temp.beginTransaction();
temp.save(log);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
temp.close();
}
}
}