package jane.core; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; public abstract class TableBase<V extends Bean<V>> { protected static final List<TableBase<?>> _tables = new ArrayList<>(16); // 所有持久化表的容器 protected final String _tableName; // 表名 protected final int _tableId; // 表ID protected final int _lockId; // 当前表的锁ID. 即锁名的hash值,一般和记录key的hash值计算得出记录的lockId protected final V _deleted; // 表示已删除的value. 同存根bean protected final AtomicLong _readCount = new AtomicLong(); // 读操作次数统计 protected final AtomicLong _readStoCount = new AtomicLong(); // 读数据库存储的次数统计(即cache-miss的次数统计) public static List<TableBase<?>> getTables() { return _tables; } /** * 尝试依次加锁并保存全部表已修改的记录 * <p> * @param counts 长度必须>=3,用于保存3个统计值,分别是保存前所有修改的记录数,保存后的剩余记录数,保存的记录数 */ static void trySaveModifiedAll(long[] counts) { for(TableBase<?> table : _tables) { try { table.trySaveModified(counts); } catch(Throwable e) { Log.log.error("db-commit thread exception(trySaveModified:" + table.getTableName() + "):", e); } } } /** * 在所有事务暂停的情况下直接依次保存全部表已修改的记录 */ static int saveModifiedAll() { int m = 0; for(TableBase<?> table : _tables) { try { m += table.saveModified(); } catch(Throwable e) { Log.log.error("db-commit thread exception(saveModified:" + table.getTableName() + "):", e); } } return m; } protected TableBase(int tableId, String tableName, V stubV, int lockId) { _tableName = tableName; _tableId = tableId; _lockId = lockId; _deleted = stubV; } /** * 获取表ID */ public int getTableId() { return _tableId; } /** * 获取表名 */ public String getTableName() { return _tableName; } /** * 获取读缓存记录数 */ public abstract int getCacheSize(); /** * 获取写缓存记录数 */ public abstract int getCacheModSize(); /** * 获取对当前表读取的统计次数 */ public long getReadCount() { return _readCount.get(); } /** * 获取对当前表存储的统计次数(即cache-miss的统计次数) */ public long getReadStoCount() { return _readStoCount.get(); } /** * 尝试依次加锁并保存此表已修改的记录 * <p> * @param counts 长度必须>=3,用于保存3个统计值,分别是保存前所有修改的记录数,保存后的剩余记录数,保存的记录数 */ protected abstract void trySaveModified(long[] counts); /** * 在所有事务暂停的情况下直接依次保存此表已修改的记录 */ protected abstract int saveModified(); }