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

openfire(3)数据库浅析

 
阅读更多

openfire 中的连接有几种,可以自己实现接口ConnectionProvider,修改openfire.xml中的connectionProvider的属性为自己实现的类。

<connectionProvider>
    <className>org.jivesoftware.database.DefaultConnectionProvider</className>
  </connectionProvider>
  <database>
    <defaultProvider>
      <driver>com.mysql.jdbc.Driver</driver>
      <serverURL>jdbc:mysql://localhost:3306/openfire?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;zeroDateTimeBehavior=convertToNull</serverURL>
      <username>root</username>
      <password>admin</password>
      <testSQL>select 1</testSQL>
      <testBeforeUse>false</testBeforeUse>
      <testAfterUse>false</testAfterUse>
      <minConnections>5</minConnections>
      <maxConnections>25</maxConnections>
      <connectionTimeout>1.0</connectionTimeout>
    </defaultProvider>
  </database>

 

openfire实现了3个相关的接口,JNDIDataSourceProvider,EmbeddedConnectionProvider,DefaultConnectionProvider(默认的连接管理器),下面将分别解析这三个类。

 

 

1. DefaultConnectionProvider:是openfire提供的默认连接管理器,使用了org.logicalcobwebs.proxool.ProxoolDriver提供的连接池,

其中ConnectionProvider的start方法如下,主要设置连接池的相关参数

 

 public void start() {
        proxoolURL = "proxool.openfire:"+getDriver()+":"+getServerURL();
        settings = new Properties();
        settings.setProperty("proxool.maximum-activetime", Integer.toString(activeTimeout));
        settings.setProperty("proxool.maximum-connection-count", Integer.toString(getMaxConnections()));
        settings.setProperty("proxool.minimum-connection-count", Integer.toString(getMinConnections()));
        settings.setProperty("proxool.maximum-connection-lifetime", Integer.toString((int)(86400000 * getConnectionTimeout())));
        settings.setProperty("proxool.test-before-use", testBeforeUse.toString());
        settings.setProperty("proxool.test-after-use", testAfterUse.toString());
        settings.setProperty("proxool.house-keeping-test-sql", testSQL);
        settings.setProperty("user", getUsername());
        settings.setProperty("password", (getPassword() != null ? getPassword() : ""));
    }

 

2.EmbeddedConnectionProvider(嵌入式连接管理器),主要是用于openfire中采用的hsqldb.

  public Connection getConnection() throws SQLException {
        try {
            Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
            return DriverManager.getConnection(proxoolURL, settings);
        }
        catch (ClassNotFoundException e) {
            throw new SQLException("EmbeddedConnectionProvider: Unable to find driver: "+e);
        }
    }

,此也采用org.logicalcobwebs.proxool.ProxoolDriver代理连接池。

 

hsqldb,的存放地址为openfire目录下的embedded-db中。

  File databaseDir = new File(JiveGlobals.getHomeDirectory(), File.separator + "embedded-db");
        // If the database doesn't exist, create it.
        if (!databaseDir.exists()) {
            databaseDir.mkdirs();
        }

        try {
            serverURL = "jdbc:hsqldb:" + databaseDir.getCanonicalPath() + File.separator + "openfire";
        }
        catch (IOException ioe) {
            Log.error("EmbeddedConnectionProvider: Error starting connection pool: ", ioe);
        }

 

Hsqldb是一个开放源代码的JAVA数据库,其具有标准的SQL语法和JAVA接口,它可以自由使用和分发,非常简洁和快速的。具有Server模式,进程内模式(In-Process)和内存模式(Memory-Only)三种。运行Hsqldb需要hsqldb.jar包, 它包含了一些组件和程序。每个程序需要不同的命令来运行。

更多关于Hsqldb请查看其它相关资料,在openfire中使用的标准的sql。

 

 

3.JNDIDataSourceProvider

openfire提供的JNDI连接器。

 public void start() {
        if (dataSourceName == null || dataSourceName.equals("")) {
            Log.error("No name specified for DataSource. JNDI lookup will fail", new Throwable());
            return;
        }
        try {
            Properties contextProperties = new Properties();
            for (String key: jndiPropertyKeys) {
                String value = JiveGlobals.getXMLProperty(key);
                if (value != null) {
                    contextProperties.setProperty(key, value);
                }
            }
            Context context;
            if (contextProperties.size() > 0) {
                context = new InitialContext(contextProperties);
            }
            else {
                context = new InitialContext();
            }
            dataSource = (DataSource)context.lookup(dataSourceName);
        }
        catch (Exception e) {
            Log.error("Could not lookup DataSource at '" + dataSourceName + "'", e);
        }
    }

 

其主要属性有:

 private static final String[] jndiPropertyKeys = {
        Context.APPLET,
        Context.AUTHORITATIVE,
        Context.BATCHSIZE,
        Context.DNS_URL,
        Context.INITIAL_CONTEXT_FACTORY,
        Context.LANGUAGE,
        Context.OBJECT_FACTORIES,
        Context.PROVIDER_URL,
        Context.REFERRAL,
        Context.SECURITY_AUTHENTICATION,
        Context.SECURITY_CREDENTIALS,
        Context.SECURITY_PRINCIPAL,
        Context.SECURITY_PROTOCOL,
        Context.STATE_FACTORIES,
        Context.URL_PKG_PREFIXES
    };

具体可查看JNDI相关。

 

4.实现自己的连机器(ConnectionProvider),

public interface ConnectionProvider {


    public boolean isPooled();

   
    public Connection getConnection() throws SQLException;

   
    public void start();

   
    public void restart();
    public void destroy();
}

需要写以上相关方法,可以用通用的连接池,c3p0,阿帕奇的dbcp等。

 

对于openfire比较遗憾的是,没有相关事务的管理,关于sql的处理在各个模块都有,耦合性较大。

 

此篇文章就到此,稍后会有更多关于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在使用MySQL数据库后的中文乱码问题解决.docx

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

    Openfire数据结构详解

    在Openfire中,数据存储是通过数据库实现的,而本文将深入解析Openfire数据库中的关键数据结构,以便理解其工作原理和管理方式。 1. **ofGroup**:这是用户组的数据表,用于存储用户组的信息。主键是`groupName`,...

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

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

    openfire_3_10_2所有缺少的jar包整理

    1. 数据库连接库:Openfire支持多种数据库,如MySQL、PostgreSQL等,因此可能需要对应的JDBC驱动JAR包,如mysql-connector-java.jar。这些驱动使得Openfire能够与数据库进行交互,存储用户信息、群组数据等。 2. ...

    openfire_3_9_3.tar.zip

    2. **配置环境**:在解压后的目录中,找到并编辑`conf/openfire.xml`配置文件,设置服务器地址、端口、数据库连接参数等关键信息。同时,确保你的服务器已经安装了Java运行环境(JRE)。 3. **启动服务**:运行解压...

    linux下openfire安装配置

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

    重新配置OpenFire数据库

     -bash-4.1$ cd /usr/local/openfire/bin  -bash-4.1$ ./openfire stop  2.找到openfire配置文件  [root@openfire.clvn.com.cn ~]# cd /usr/local/openfire/conf/  [root@openfire.clvn.com.cn conf]# ls ...

    Openfire配置

    安装Openfire前需要下载相应的安装程序,这里以openfire_3_6_4版本为例。安装程序安装完成后,不要急于启动Openfire服务,而是需要先配置使用的数据库。具体来说,需要在MySQL数据库中创建一个名为openfire的数据库...

    openfire_src_3_8_2.zip

    3. **认证与授权**:Openfire使用标准的XMPP认证机制,同时提供了用户和群组的权限管理。 4. **存储与检索**:Openfire提供了多种存储机制,如SQLite、MySQL等,用于存储用户信息、聊天记录等。 五、源码学习与...

    openfire3_9_1

    openfire 3_9_1,welcome download, for free

    openfire企业版插件

    8. **database** 目录:可能包含数据库相关的脚本或配置,用于与Openfire的数据库交互,比如用户数据存储、聊天记录管理和权限控制等。 综合上述文件,我们可以推测这个Openfire企业版插件可能涉及以下知识点: - ...

Global site tag (gtag.js) - Google Analytics