public void deleteAccount(final String username) throws IOException {
		
		if( username.equals("admin") ) { 
			throw new IOException("Cannot delete admin");
		}
		
		final StringBuffer doReload = new StringBuffer();
		
		
		/**
		 * For some reason, ON DELETE CASCADE referencing valid_accounts produces a weird derby error, 
		 * so we do this manually. 1) get uid, 2) delete uid's keys, 3) delete uid's account 
		 */
		final Long uid = (new SQLStatementProcessor<Long>("SELECT uid FROM valid_accounts WHERE username = ?") {
			Long process( PreparedStatement s ) throws SQLException {
				s.setString(1, username);
				ResultSet rs = s.executeQuery();
				if( !rs.next() ) {
					return -1L;
				}
				return rs.getLong(1);
			}
		}).doit();
		
		if( uid == -1 ) {
			throw new IOException("no such user");
		}
		
		logger.fine("got uid: " + uid); 
		
		(new SQLStatementProcessor<Void>("DELETE FROM registered_keys WHERE created_by_account = ?") {
			Void process( PreparedStatement s ) throws SQLException {
				s.setLong(1, uid);
				int deleted = 0;
				/**
				 * Best effort consistency -- this delete might take a while, so we might as well delay 
				 * requests that would be inconsistent if possible before the reload 
				 */
				synchronized(CommunityDAO.this) {
					deleted = s.executeUpdate();
				}
				logger.info("Deleted " + deleted + " before deleting account: " + username);
				return null;
			}
		}).doit();
		
		IOException out = (new SQLStatementProcessor<IOException>("DELETE FROM valid_accounts WHERE username = ?") {
			IOException process( PreparedStatement s ) throws SQLException {
				s.setString(1, username);
				logger.finest("Executing delete user update: " + username);
				int updated = s.executeUpdate();
				if( updated == 0 ) {
					return new IOException("No such user? " + updated);
				} else {
					/**
					 * we probably just removed a bunch of keys, re-sync
					 */
					logger.fine("Removed user, setting reload");
					doReload.append("t");
				}
				return null;
			}
		}).doit();
		if( out != null ) {
			throw out;
		}
		
		if( doReload.length() > 0 ) {
			logger.fine("Reloading...");
			load();
		}
	}