`
buerkai
  • 浏览: 170243 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

openfire(4)数据库浅析之序列

 
阅读更多

openfire中提供了生产序列的管理器(SequenceManager),其构造函数如下:

 

public SequenceManager(int seqType, int size) {
        managers.put(seqType, this);
        this.type = seqType;
        this.blockSize = size;
        currentID = 0l;
        maxID = 0l;
    }

seqType,为序列类型,默认有3种类型:

    public static final int ROSTER = 18;
    public static final int OFFLINE = 19;
    public static final int MUC_ROOM = 23;

 

size:序列的增加值。例如a=a+2;

 

 

private void getNextBlock(int count) {
        if (count == 0) {
            Log.error("Failed at last attempt to obtain an ID, aborting...");
            return;
        }

        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        boolean abortTransaction = false;
        boolean success = false;

        try {
            con = DbConnectionManager.getTransactionConnection();
            // Get the current ID from the database.
            pstmt = con.prepareStatement(LOAD_ID);
            pstmt.setInt(1, type);
            rs = pstmt.executeQuery();

            long currentID = 1;
            if (rs.next()) {
                currentID = rs.getLong(1);
            }
            else {
                createNewID(con, type);
            }
            DbConnectionManager.fastcloseStmt(rs, pstmt);

            // Increment the id to define our block.
            long newID = currentID + blockSize;
            // The WHERE clause includes the last value of the id. This ensures
            // that an update will occur only if nobody else has performed an
            // update first.
            pstmt = con.prepareStatement(UPDATE_ID);
            pstmt.setLong(1, newID);
            pstmt.setInt(2, type);
            pstmt.setLong(3, currentID);
            // Check to see if the row was affected. If not, some other process
            // already changed the original id that we read. Therefore, this
            // round failed and we'll have to try again.
            success = pstmt.executeUpdate() == 1;
            if (success) {
                this.currentID = currentID;
                this.maxID = newID;
            }
        }
        catch (SQLException e) {
            Log.error(e.getMessage(), e);
            abortTransaction = true;
        }
        finally {
            DbConnectionManager.closeStatement(rs, pstmt);
            DbConnectionManager.closeTransactionConnection(con, abortTransaction);
        }

        if (!success) {
            Log.error("WARNING: failed to obtain next ID block due to " +
                    "thread contention. Trying again...");
            // Call this method again, but sleep briefly to try to avoid thread contention.
            try {
                Thread.sleep(75);
            }
            catch (InterruptedException ie) {
                // Ignore.
            }
            getNextBlock(count - 1);
        }
    }

此方法为:更具类型到数据库中ofid查询ID,获取表中的id,然后id加一个变量,然后将新的id更新到数据库中。

 

private void createNewID(Connection con, int type) throws SQLException {
        Log.warn("Autocreating jiveID row for type '" + type + "'");

        // create new ID row
        PreparedStatement pstmt = null;

        try {
            pstmt = con.prepareStatement(CREATE_ID);
            pstmt.setInt(1, type);
            pstmt.execute();
        }
        finally {
            DbConnectionManager.closeStatement(pstmt);
        }
    }

在表中创建一条序列的记录。

 

此篇文章就到此,稍后会有更多关于openfire的个人解读。

联系方式(qq):851392159

出处:http://buerkai.iteye.com

 

分享到:
评论

相关推荐

    openfire 集成用户数据库

    ### Openfire集成用户数据库知识点详解 #### 一、引言 在企业级即时通讯系统部署过程中,为了确保数据的一致性和提高用户体验,通常会遇到一个关键需求:将Openfire服务器与现有的用户数据库进行集成。这样的集成...

    openfire 数据库字典

    openfire自带数据库的字典,详细展示数据库的每个表的结构,并备注了每个字段的含义,对开发者有很好的帮助。

    openfire数据库表结构

    Openfire 数据库表结构详解 Openfire 是一个流行的即时通信服务端,使用数据库来存储数据。了解 Openfire 数据库的表结构是非常重要的,因为它可以帮助开发者更好地理解和使用 Openfire。 Openfire 数据库表结构...

    openfire 数据库 数据库字典。

    数据库字典,想了解的朋友。这个真的不错。openfire再次开发必备资料。

    Openfire数据库架构指南(英文原版与中文翻译版)

    **Openfire数据库架构指南** Openfire是一款开源的即时通讯服务器,它基于XMPP协议,用于构建实时通信系统。本文将深入探讨Openfire的数据库架构,包括其设计原理、表结构和字段含义,以便理解Openfire如何存储和...

    openfire数据库模式指南

    openfire数据库模式指南,列出了其所有数据库表结构及说明

    如何安装配置Openfire for苹果

    5. 选择数据库:在下一个页面,Openfire提供了一个内置的数据库选项,对于初次安装,建议选择“嵌入的数据库”。点击“继续”。 6. 保持默认设置:如果对数据库配置不熟悉,可以保留默认的“初始设置”,这将使用...

    openfire 脚本文件

    openfire 脚本文件

    openfire_4_1_4.tar.gz

    4. **多语言支持**:Openfire的Web管理界面支持多种语言,便于全球用户使用。4.1.4版本可能对语言包进行了更新,优化了用户体验。 5. **插件系统**:Openfire拥有强大的插件生态系统,允许用户根据需求添加额外的...

    openfire_4_0_1

    - 下载最新版本的Openfire安装包,如"openfire_4_0_1",并解压到指定目录。 - 双击运行`setup.exe`,按照向导进行安装。选择安装路径,注意保持路径中不含中文字符,以避免潜在问题。 - 安装过程中,可以选择创建...

    Openfire在使用MySQL数据库后的中文乱码问题解决.docx

    Openfire 是一款基于 Java 开发的即时通讯(IM)服务器,它支持跨平台运行,并且可以与多种数据库系统集成,包括 MySQL 和 Oracle。在使用 MySQL 作为数据存储时,Openfire 用户经常遇到一个常见的问题,那就是中文...

    Openfire数据结构详解

    4. **ofID**:这个表用于生成唯一的ID序列,`idType`标识ID的类型,`id`则为下一个可用的ID编号。 5. **ofOffline**:离线邮件存储,保存用户离线时接收到的消息。`username`、`messageID`和`creationDate`构成主键...

    openfire_4_1_5

    5. **数据库集成**:Openfire支持多种数据库管理系统,如MySQL、PostgreSQL、Oracle等,可以根据组织的需求进行选择和配置。 6. **管理界面**:提供直观的Web管理界面,使得管理员能够轻松管理用户、群组、服务器...

    openfire_4_0_1.tar.gz

    5. **初始化数据库**:Openfire支持多种数据库,如MySQL、PostgreSQL等。根据实际情况选择,创建相应的数据库,并配置Openfire的database.properties文件。 6. **启动服务**:执行 `./openfire start` 命令启动...

    openfire聊天记录插件(含有数据库脚本)

    如果你的Openfire服务器配置了其他类型的数据库(如PostgreSQL、Oracle等),你可以参照MySQL脚本的模式来创建相应的表结构,因为大多数SQL方言都支持类似的创建表的语法。 在部署此插件时,首先,你需要确保你的...

    openfire_4_2_0.tar.gz

    4. **数据库连接**:Openfire支持多种数据库,包括MySQL、PostgreSQL等。根据你的需求,选择合适的数据库并配置相应的连接信息。默认情况下,Openfire使用内置的HSQLDB,对于生产环境,推荐使用更稳定的MySQL或...

    linux下openfire安装配置

    为了在Linux系统上成功安装并配置Openfire,我们需要遵循一系列步骤,涉及的主要组件包括JDK(Java Development Kit)和MySQL数据库。 首先,我们需要确保系统已经安装了Java运行环境。JDK是开发和运行Java应用程序...

    Openfire配置

    数据库驱动jar包的配置是Openfire安装的关键步骤之一。以MySQL数据库为例,需要将对应的jar包mysql-connector-java-5.1.7-bin.jar复制到Openfire安装目录下的lib文件夹内,以确保Openfire能够正确加载数据库驱动。 ...

    openfire_4_2_3-x64

    Openfire的安装过程简洁高效,通过提供的`openfire_4_2_3_x64.exe`执行文件,可以在Windows 64位系统上快速完成部署。安装过程中,用户只需要按照向导提示进行,即可轻松设置服务器的基本配置,包括数据库连接、管理...

    openfire_4_6_4_bundledJRE.exe

    openfire服务端自带jre

Global site tag (gtag.js) - Google Analytics