|
许多开发人员使用 memcached 和 MySQL 缓存 Web 应用程序的内容。本文提供了一个简单的示例应用程序,它可以使用 MySQL 并访问 memcached 服务器。此应用程序将在 GlassFish 应用服务器上开发。
示例应用程序将在运行 Sun Ultra 40 操作系统的工作站上开发和部署。本文所使用的命令和路径名格式适用于 Solaris 10 OS,但是您也可以轻松地将它们应用到其它平台。
目录
安装工具
运行示例应用程序
应用程序概述
结束语
更多信息
安装工具
要成功运行示例应用程序,必须安装以下软件:
MySQL 数据库。MySQL 是世界上最流行的开源数据库软件。
GlassFish v2 Update 1。GlassFish 是一款免费的开源应用服务器,它实现了 Java EE 5 平台的最新特性。
Memcached Caching System。根据 memcached 网站 的定义,memcached 是一个使用分布式内存的对象缓存系统,它应用广泛,但其主要用途是通过减轻数据库负载来加速动态 Web 应用程序。如果 Web 应用程序的某部分内容需要频繁修改,那么非常适合缓存到 memcached 服务器中。通过缓存这些内容,您可以提高应用程序的响应性。
memcached 的一个经典的用例场景是 标记云。标记云 是一组加权标记,通常以字符形式显示。这些标记可以按字母顺序显示,也可以随机显示或按照权证排序,等等,并且不会频繁更新。
本文描述的示例应用程序重用了来自人们熟知的示例 Java Pet Store 应用程序 中的组件,创建了一个与宠物有关的标记云。
安装 GlassFish-MySQL 包
GlassFish 应用服务器和 MySQL 以方便的单个包形式发布。您可以免费下载和安装这个包。只需遵循以下说明:
- 下载 GlassFish V2 + MySQL 二进制文件。
- 遵循 安装指南 中的说明安装这个包,特别是 Installing Application Server 9.1 Update 1 With MySQL Community Server 小节。
包安装完毕后,务必遵循安装指南的 To Start MySQL 小节中的说明。这些说明描述如何创建必要的 MySQL 数据库和用户。您将查找脚本来安装数据库和表,应用程序在本文后面将要用到。
启动 GlassFish 应用服务器
使用以下命令启动 GlassFish 应用服务器:
$GLASSFISH_HOME/bin/asadmin start-domain domain1
|
其中,环境变量 $GLASSFISH_HOME 所指向的位置就是您安装 GlassFish v2 的位置 — 例如,/export/home/glassfish_install/v2ur1/glassfish.
GlassFish 日志文件
您可以在系统中通过以下位置访问日志文件,其中包含了有关服务器的信息:
$GLASSFISH_HOME/domains/domain1/logs/server.log
|
安装 Memcached
如果使用的是 Solaris OS,那么可以使用 Cool Stack 安装 memcached,这是一个专门针对 Sun Solaris 平台进行优化了的开源软件栈。用于其他平台的二进制文件可以从 memcached 网站 获得。
在 Solaris 10 环境中成功安装好 Cool Stack 后,可通过以下位置获得 memcached 可执行文件:
/opt/coolstack/bin/memcached
|
现在可以从命令行启动 memcached 服务器。例如,要在 Solaris 10 机器上使用 IP 地址 123.456.789.123 启动 memcached 服务器并接受端口 11211 上的连接,使用以下命令:
/opt/coolstack/bin/memcached -d -m 2048 -l 123.456.789.123 -p 11211
|
下载示例应用程序
下载 示例应用程序(一个 jar 文件),并提取到一个目录中。例如,使用下面的命令将 jar 文件扩展到 /export/home/samples/memcachedSample 目录:
mkdir /export/home/samples cd /export/home/samples jar xvf /export/home/downloads/memcachedSample.jar cd memcachedSample
|
本文其余内容假设应用程序目录是 /export/home/samples/memcachedSample,标识为 <application_dir>。
应用程序使用由 Greg Whalin 维护的 Whalin memcached Java 客户机 访问 memcached 服务器。也可以使用其他 memcached Java 客户机。本文的作者使用 Whalin 的客户机,这是因为它具有强大的文档和丰富的支持。
如果希望修改示例应用程序并进行扩展来解决自己的业务问题,那么请仔细研究 Whalin 客户机是否合适,如果不合适的话,就选择另一种客户机。
针对 Memcached 服务器配置应用程序
要是示例应用程序正常工作,必须编辑一个指定了服务器信息的源文件。这个文件称为 WhalinMemcachedClient.java,在这个文件中,可以根据用来启动 memcached 服务器的 IP 地址和端口号来表示服务器。
- 要使用 Vi 文本编辑器编辑文件,使用下列命令:
cd <application_dir> cd src/java/com/sun/javaee/blueprints/petstore/cache vi WhalinMemcachedClient.java
|
当然,您可以使用另一种文本编辑器。
- 在这个文件中,查找下面的内容:
String[] servers = { ... }
|
使用 memcached 服务器的 IP 地址和端口号替换以上大括号中的 IP 地址和端口号,例如,
String[] servers = { "123.456.789.123:11211" }
|
- 您可能还需要编辑下一部分:
Integer[] weights = { ... }
|
权值使用整数表示每个服务器处理负载的能力,其中整数越大表示服务器处理负载的能力越强。使用上一步中服务器的排列顺序列出权值。例如,如果某个服务器的权值为 3,那么按如下所示编辑权值声明:
Integer[] weights = { 3 }
|
参见 memcached Javadoc 中的 SockIOPool 以获得更多信息。
编辑 Build Properties 文件
现在,编辑 build.properties 文件确保 javaee.home 的值和环境变量 GLASSFISH_HOME 的值相同,该值是您安装 GlassFish v2 的位置。
- 在文本编辑器中,打开文件
<application_dir>/bp-project/build.properties.
|
- 在
build.properties 文件中,搜索 javaee.home 属性。如果其值与 GLASSFISH_HOME 的值不同,那么根据需要编辑该值。
作出修改后,可以开始构建应用程序。
构建应用程序
使用以下命令构建应用程序:
创建一个 MySQL 用户和数据库
必须创建一个 MySQL 用户和数据库供示例应用程序使用。还必须创建数据库表并向其中装载数据。
- 在一个命令 shell 中,以根的身份启动 MySQL:
- 使用以下 MySQL 命令创建一个用户和数据库,并编辑 MySQL。
mysql>create database memcachedSample; mysql>create user web20 identified by web20; mysql>use memcachedSample; mysql>grant all privileges on 'web20'@'localhost' identified by 'web20' with grant privileges; mysql>flush privileges; mysql>exit;
|
- 使用以下命令创建表并向其中装载数据:
>mysql -uweb20 -pweb20 -Dbpwebapp < \ <application_dir>/setup/sql/create_mysql.sql >mysql -uweb20 -pweb20 -Dbpwebapp < \ <application_dir>/setup/sql/memcachedSampledata.sql
|
创建 JDBC 连接池和 JNDI 资源
您必须为示例创建 JDBC 连接池和 JNDI 资源。memcachedSample 目录中的 build.xml 文件包含用来创建资源的 ant 目标。
使用以下命令创建需要的 JDBC 连接池和 JNDI 资源:
cd <application_dir>/ ant create-resource-local
|
部署应用程序
您现在已经准备好使用应用程序 war 文件 memcachedSample.war 部署应用程序,该文件位于 memcachedSample/dist 目录。使用下面的命令部署应用程序:
cd <application_dir>/dist $GLASSFISH_HOME/bin/asadmin deploy memcachedSample.war
|
如果部署成功,浏览器应该能够访问应用程序主页,其 URL 为:
http://server:8080/memcachedSample
|
如果无法访问应用程序主页,请参考服务器日志了解可能发生的错误。日志文件可以通过以下位置获得:
$GLASSFISH_HOME/domains/domain1/logs/server.log
|
运行示例应用程序
要启动应用程序,在 Web 浏览器的地址栏输入以下 URL:
http://server:8080/memcachedSample
|
浏览器应打开如图 1 所示的页面。
图 1. 示例应用程序索引页面
|
单击 Run the Sample 时,服务器将生成 index.jsp 页面并装载到您的浏览器。这个页面如图 2 所示,显示了标记云。显示标记云的完整 HTML 部分被缓存到 memcached 服务器。当第一次装载页面时,将在后端 MySQL 数据库中执行一个查询,随后描述标记云的 HTML 部分被保存到 memcached 服务器。
图 2. 示例应用程序标记云
|
通过单击显示区右上方的 Memcached Stats,您可以查看应用程序已知的 memcached 服务器的统计信息。在图 3 中,注意应用程序识别出运行在同一机器上不同端口的两个 memcached 实例:11211 和 11212。
图 3. Memcached 服务器统计信息
|
注意统计信息页面底部的 Remove TagCloud 链接。当单击该链接时,保存在 memcached 服务器中的标记云的条目将被删除。随后调用 index.jsp 重新装载内容。
注意页面右上角的 Tag 链接。单击该链接使您能够为标记云创建新的标记。应用程序还包含代码可以在创建新标记时将缓存的标记云从 memcached 服务器中删除。
图 4 显示了可以加载新标记的页面。
图 4. 添加新的标记
|
通过使用 Java Persistence API (JPA) 调用查询数据库,可以获得页面底部显示的当前标记列表。这些信息也可以保存到 memcached 服务器。
应用程序概述
如前所述,示例应用程序重用了 Java Pet Store 应用程序 的组件,创建了一个标记云显示与宠物有关的标记。要尽量保持示例简单,对 memcached 服务器的调用被合并到 JavaServer Pages (JSP) 技术页面中。下面是三个有关的 JSP 文件:
web/index.jsp web/createTag.sjp web/memcachedStats.jsp
|
可以检查每个文件以查看与 memcached 服务器的交互方式。
index.jsp 文件
打开 web/index.jsp 文件,并在接近结束部分查找以下代码块:
String tagCloudStr = (String) mcc.get("tagCloud"); if (tagCloudStr == null) { tagCloudStr = cf.getTagsCloudInfo(3); mcc.set(tagCloudKey, tagCloudStr); }
|
第一个语句将使用 tagCloud 键查看 memcached 服务器是否具有标记云信息。if 测试判断信息是否显示出。如果没有的话,将通过调用 cf.getTagsCloudInfo() 方法获得,其中 cf 是 CatalogFacade 类的实例。该方法使用标记数作为参数以显示在每一行 — 在本例中为 3。此方法的逻辑可总结如下:
- 使用 Java Persistence API 调用从后端 MySQL 数据库获取数据。
- 使用返回的结果创建于标记云相关的 HTML 表单元组件。
- 使用一些逻辑将每个标记与字体大小关联起来,这些字体大小将用来显示标记云中的标记。
创建 HTML 字符串后,将通过调用 mcc.set(tagCloudKey, tagCloudStr) 将它保存到 memcached 服务器,其中 tagCloudKey 的值为 tagCloud。
createTag.jsp 文件
打开 web/createTag.jsp 文件并找到以下代码行:
String tagName = request.getParameter("tagName");
if (tagName != null && !"".equals(tagName)) { // Insert the tag into the database. cf.addTag(tagName); mcc.delete(tagCloudKey); // where tagCloudKey = "tagCloud" }
|
该代码将一个新标记插入到数据库。完成此操作后,mcc.delete() 方法从 memcached 服务器中删除与 tagCloudKey 相关的信息。
memcachedStats.jsp 文件
打开 web/memcachedStats.jsp 文件并注意以下语句:
Map allServersInfo = mcc.stats();
|
mcc.stats() 方法是 Whalin memcached Java 客户机提供的 API 的一部分。它用于显示 memcached 服务器的统计信息。它返回的映射根据服务器名确定键。其值是另一个包含统计信息的映射,其中使用 stat name 作为键,而 value 作为值。
参考 Whalin memcached 客户机的 Javadocs 以获得更多信息。
结束语
在本文中,您部署了一个简单的示例应用程序,它使用 MySQL 作为数据库并访问一个 memcached 服务器。您在 GlassFish 应用服务器上部署了示例应用程序。通过使用示例中演示的技术,您可以使用 memcached 分布式内存缓存系统来提高具有数据库支持的 Web 应用程序的性能。
更多信息
致谢
本文作者在此感谢以下人员对本文的贡献:
|