26.4. MySQL Connector/MXJ
- 26.4.1. 前言
- 26.4.2. 支持平台:
- 26.4.3. Junit测试要求
- 26.4.4. 运行Junit测试
- 26.4.5. 作为JDBC驱动程序的一部分运行
- 26.4.6. 在Java对象中运行
- 26.4.7. MysqldResource API
- 26.4.8. 在JMX代理(custom)中运行
- 26.4.9. 部署在标准的JMX代理环境下 (JBoss)
- 26.4.10. 安装
26.4.1. 前言
MySQL Connector/MXJ是一种Java实用工具软件包,用于部署和管理MySQL数据库。可以将Connector/MXJ捆绑到已有的Java应用程序,或将其作为JMX Mbean部署。MySQL的部署和使用十分简单,就像为JDBC连接URL添加额外参数一样简单,连接建立后,连接URL将启动数据库。这样,Java开发人员能够通过降低其最终用户的安装难度,更容易地部署需要数据库的应用程序。MySQL Connector/MXJ使得MySQL数据库像是基于java的组件。它通过下述步骤完成该任务,确定系统所运行的平台,选择恰当的二进制文件,并执行程序。也能可选地部署具有任何指定参数的个初始数据库。
作为一种JMX Mbean,MySQL Connector/MXJ需要与JMX v1.2兼容的Mbean容器,如Jboss版本4。Mbean将使用标准的JMX管理API来展示与平台相适应的参数(并允许设置参数)。
其中包含与JDBC驱动程序一起使用的说明,以及以JMX Mbean方式将其部署至Jboss的说明。
可从下述站点下载源版本和二进制版本:http://dev.mysql.com/downloads/connector/mxj/
这是一种测试板,欢迎反馈和鼓励。
如有任何问题或意见,请发送电子邮件至java@lists.mysql.com。
26.4.2. 支持平台:
Linux, i386
Windows NT, x86
Windows 2000, x86
Windows XP, x86
Solaris 9, SPARC 32
26.4.3. Junit测试要求
要想确保你的平台是在支持范围内,最好方法是运行Junit测试。首先应确保组件能够在平台上工作。由于“MysqldResource”类实际上是MySQL固有版本的包装器,并非所有的平台均支持它。编写本文时,对运行在i386架构上的Linux进行了测试,看上去工作良好,就像在OS X v10.3上一样。在Windows和Solaris平台上进行了有限测试。
要求:
1. JDK-1.4或更高版本(或JRE,如果不打算编译源文件或JSP的话)。
2. 通过CLASSPATH安装了并提供了MySQL Connector/J版本3.1或更高版本(http://dev.mysql.com/downloads/connector/j/)。
3. 用于JMX版本1.2.1的javax.management类,它们位于下述应用服务器上:
·JBoss - 4.0rc1或更高版本
·Apache Tomcat - 5.0或更高版本
·Sun公司的JMX参考实施版本1.2.1,http://java.sun.com/products/JavaManagement/。
4. Junit 3.8.1(http://www.junit.org/)
如果从源码创建,除了上述所有要求外,还须满足:
1. Ant版本1.5或更高版本(可从http://ant.apache.org/上下载)。
26.4.4. 运行Junit测试
1. 这类测试将尝试在3336端口上启动MySQL。如果有正在运行的MySQL,可能会出现冲突,但可能性不大,原因在于MySQL的默认端口是3306。然而,也可以将“c-mxj_test_port”Java属性设置为你所选择的端口。作为可选方式,你也可以通过关闭运行在目标机器上的MySQL实例来启动测试。
默认情况下,测试结果将输出到控制台。要想获得详细输出,可以将“c-mxj_test_silent”Java属性设置为“假”。
2. 要想运行Junit测试套件,$CLASSPATH必须包含下述部分:
·JUnit
·JMX
·Connector/J
·MySQL Connector/MXJ
3. 如果你下载的文件中不含connector-mxj.jar,请解包MySQL Connector/MXJ源码档案文件。
4. cd mysqldjmx
5. ant dist
随后,将$TEMP/cmxj/stage/connector-mxj/connector-mxj.jar添加到CLASSPATH(类路径)。
6. 如果有junit,执行单元测试。从命令行上输入:
7. java junit.textui.TestRunner com.mysql.management.AllTestsSuite
输出与下面给出的类似:
.........................................
.........................................
..........
Time: 259.438
OK (101 tests)
注意,在快结束时速度会变慢,请耐心等候。
26.4.5. 作为JDBC驱动程序的一部分运行
MySQL Connector/J JDBC驱动程序的1个特点是,能够在JDBC连接字符串中将“SocketFactory”指定为参数。MySQL Connector/MXJ包含1个定制的SocketFactory。首次连接时,SocketFactory将部署并启动MySQL数据库。SocketFactory也会显示1个“shutdown”方法。
要想使用它,请在JDBC连接字符串上指定“socketFactory”参数,并将其值设为“com.mysql.management.driverlaunched.ServerLauncherSocketFactory”。
在下面的示例中,有1个能创建连接的程序,执行查询,并将结果输出到System.out。MySQL数据库将作为连接进程的组成部分予以部署并启动,最后是结束部分。
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import com.mysql.management.driverlaunched.ServerLauncherSocketFactory;public class ConnectorMXJTestExample { public static void main(String[] args) throws Exception {String hostColonPort = "localhost:3336";String driver = com.mysql.jdbc.Driver.class.getName();String url = "jdbc:mysql://" + hostColonPort + "/" + "?"+ "socketFactory="+ ServerLauncherSocketFactory.class.getName();String userName = "root";String password = "";Class.forName(driver);Connection conn = null;try { conn = DriverManager.getConnection(url, userName, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT VERSION()"); rs.next(); String version = rs.getString(1); rs.close(); stmt.close(); System.out.println("------------------------"); System.out.println(version); System.out.println("------------------------");} finally { try {conn.close(); } catch (Exception e) {e.printStackTrace(); } ServerLauncherSocketFactory.shutdown(hostColonPort);} }}
要想运行上述程序,在CLASSPATH中必须有connector-mxj.jar和Connector/J。然后键入:
java ConnectorMXJTestExample
当然,对于MySQL数据库,有很多可设置的选项。通过为每个服务器选项冠以前缀“server”,可将其作为JDBC连接字符串的部分,简单地指定这些选项。在下述示例中,我们设置了3个驱动程序参数和2个服务器参数:
String url = "jdbc:mysql://" + hostColonPort + "/" + "?"+ "socketFactory="+ ServerLauncherSocketFactory.class.getName();+ "&"+ "cacheServerConfiguration=true"+ "&"+ "useLocalSessionState=true"+ "&"+ "server.basedir=/opt/myapp/db"+ "&"+ "server.datadir=/mnt/bigdisk/myapp/data";
26.4.6. 在Java对象中运行
有1个java应用程序并打算嵌入MySQL数据库,直接使用com.mysql.management.MysqldResource类。可以使用默认的构造函数(无参量)例示该类,或者通过在java.io.File对象(代表希望服务器解包至的目录)中传递类来例示之。也可用针对“stdout”和“stderr”(用于记录)的输出流例示它。
一旦完成例示,java.util.Map,该对象将能提供与平台以及希望使用的MySQL版本相适应的服务器选项的java.util.Map。
MysqldResource允许你使用所提供的服务器选项的java.util.Map启动MySQL,并允许你关闭数据库。在下面的示例中,给出了使用明码java对象将MySQL嵌入到应用程序的简单方法。
import com.mysql.management.MysqldResource; ... public void startMySQL() {File baseDir = new File(ourAppDir, "mysql");mysqldResource = new MysqldResource(baseDir);Map options = new HashMap();options.put("port", "3336");String threadName = "OurApp MySQL";mysqldResource.start(threadName, options); }public void stopMySQL() {if (mysqldResource != null) { mysqldResource.shutdown();}mysqldResource = null; }public java.sql.Connection getConnection() throws Exception {String db = "test";String url = "jdbc:mysql://localhost:3336/" + db;String userName = "root";String password = "";Class.forName(com.mysql.jdbc.Driver.class.getName());return DriverManager.getConnection(url, userName, password); }
26.4.7. MysqldResource API
构造函数:·public MysqldResource(File baseDir, PrintStream out, PrintStream err);
允许设置安装MySQL文件的“basedir”,并设置标准输出和标准错误的输出流。
·public MysqldResource(File baseDir);
允许设置安装MySQL文件的“basedir”。标准输出和标准错误的输出将被导至System.out和System.err。
·public MysqldResource();
Basedir是java.io.tempdir的默认子目录。标准输出和标准错误的输出将被导至System.out和System.err。
MysqldResource API包含下述方法:
·void start(String threadName, Map mysqldArgs);
部署并启动MySQL。“threadName”字符串用于命名实际执行MySQL命令行命令的线程。“map”是将要传递给命令行的参量和参联值的集合。
·void shutdown();
关闭由MysqldResource对象管理的MySQL实例。
·Map getServerOptions();
返回所有选项以及MySQL数据库可用的当前选项(或默认选项,如果未运行的话)的映射。
·boolean isRunning();
如果MySQL数据库正在运行,返回“真”。
·boolean isReadyForConnections();
一旦数据库通报它已做好连接准备,返回“真”。
·void setKillDelay(int millis);
默认的“Kill Delay”是30秒。它表示发出初始关闭请求和发出“强制杀死”(如果数据库未关闭)命令之间需要等待的时间。
·void addCompletionListenser(Runnable listener);
当服务器进程完成时,允许通知应用程序。每个“listener”(监听程序)将在自己的线程中发出。
·String getVersion();
返回MySQL的版本。
·void setVersion(int MajorVersion, int minorVersion, int patchLevel);
标准分发版本仅提供了1种版本的MySQL软件包。但也能将多个版本封装在一起,并指定要使用的版本。
26.4.8. 在JMX代理(custom)中运行
如果你正在使用JMX的SUN参考实施版本,可跳过本节。或者,如果你正在部署Jboss,请跳到下一节。我们希望在JMX代理的活动中看到MysqldDynamicMBean。在com.mysql.management.jmx.sunri软件包中,它是带有2个Mbeans的JMX代理:
1. MysqldDynamicMBean,以及
2. com.sun.jdmk.comm.HtmlAdaptorServer,它提供了用于操控JMX代理内众多元素的Web接口。
启动了这个十分简单的代理程序后,允许用Web浏览器启动并停止MySQL数据库。
1. 如前所述,完成平台测试。
·当前JDK, JUnit, Connector/J, MySQL Connector/MXJ
·本节需要JMX的SUN参考实施版本
·PATH, JAVA_HOME, ANT_HOME, CLASSPATH
2. 如果不是从源码创建的,跳到下一步。
rebuild with the "sunri.present"
ant -Dsunri.present=true dist
re-run tests:
java junit.textui.TestRunner com.mysql.management.AllTestsSuite
3. 从命令行启动测试代理:
4. java com.mysql.management.jmx.sunri.MysqldTestAgentSunHtmlAdaptor &
5. 从浏览器:
6. http://localhost:9092/
7. 在MysqldAgent下
8. 选择“name=mysqld”
9. 观察Mbean视图
10. 滚动到屏幕底部,按startMysqld按钮
11. 点击“Back to MBean View”(返回Mbean视图)
12. 滚动到屏幕底部,按stopMysqld按钮
13. 杀死运行测试代理的Java进程(jmx服务器)
26.4.9. 部署在标准的JMX代理环境下 (JBoss)
一旦确定Mbean能够在平台上工作,接下来应在标准的JMX代理内部署Mbean。其中包含部署到Jboss的说明。
1. 确保有最新版本的java开发工具箱(v1.4.x),请参见前面的介绍。
·确保设置JAVA_HOME(Jboss要求JAVA_HOME)。
·确保JAVA_HOME/bin位于PATH中(不需要设置CLASSPATH,也不需要以前测试中使用的任何jar文件)。
2. 确保安装了Jboss的最新版本(v4.0RC1或更高)。
3. http://www.jboss.org/index.html
4. 选择“Downloads”。
5. 选择“jboss-4.0.zip”。
6. 选择1个镜像。
7. unzip ~/dload/jboss-4.0.zip
8. 创建JBOSS_HOME环境变量,设置解包目录。
9. 仅对Unix:
10. cd $JBOSS_HOME/bin
11. chmod +x *.sh
12.将connector-mxj.jar安装(拷贝)到$JBOSS_HOME/server/default/lib。
13.将mysql-connector-java-3.1.4-beta-bin.jar安装(拷贝)到$JBOSS_HOME/server/default/lib。
14.在$JBOSS_HOME/server/default/deploy下创建mxjtest.war目录。
15. 将index.jsp安装(拷贝)到$JBOSS_HOME/server/default/deploy/mxjtest.war。
16.在$JBOSS_HOME/server/default/deploy下创建mysqld-service.xml文件。
17. <?xml version="1.0" encoding="UTF-8"?>
18.<server>
19. <mbean code="com.mysql.management.jmx.jboss.JBossMysqldDynamicMBean"
20. name="mysql:type=service,name=mysqld">
21. <attribute name="datadir">/tmp/xxx_data_xxx</attribute>
22. <attribute name="autostart">true</attribute>
23. </mbean>
24.</server>
25.启动jboss:
·在Unix上:$JBOSS_HOME/bin/run.sh
·在Windows上:%JBOSS_HOME%\bin\run.bat
准备就绪:Jboss在屏幕上显示大量输出。
26. 当Jboss看上去停止将信息输出到屏幕上时,打开Web浏览器:http://localhost:8080/jmx-console
27.滚动到mysql部分页面底部,选择bulletedmysqld链接。
28.观察JMX MBean View页面。MySQL应已运行。
29. (如果设置了“autostart=true”可跳过该步)。滚动到屏幕底部。按Invoke按钮停止(或启动)MySQL,观察已成功完成而且无返回值的操作。点击“Back to MBean View”(返回Mbean视图)
30. 要想确定MySQL是否正在运行,打开Web浏览器http://localhost:8080/mxjtest/,应看到:
SELECT 1
returned with a result of
1
31.按照$JBOSS_HOME/server/default/deploy/mxjtest.war/index.jsp中的介绍,能够在你的Web应用程序中使用MySQL。其中提供了供测试用的测试数据库和根用户(无密码)。创建表,插入一些行,并进行一些选择。
32. 关闭MySQL。停止Jboss时,MySQL将自动停止,或:在浏览器中,滚动到MBean View底部,并按停止服务Invoke按钮中止服务。观察已成功完成而且无返回值的操作。使用ps或任务管理器查看MySQL是否已不再运行。
对于1.0.6-beta版,能够在启动时让Mbean启动MySQL数据库。此外,我们还借鉴了Jboss生命周期扩展方法的优点,关闭Jboss时能优雅地关闭数据库。
26.4.10. 安装
如果阅读了上述部分,应已完成了这些步骤。但我们在下面列出了它们,以供快速参考。
启动了驱动程序:
1. 下载并解包Connector/MXJ,将connector-mxj.jar添加到CLASSPATH。
2. 为JDBC连接字符串添加下述参数:"socketFactory=" + ServerLauncherSocketFactory.class.getName()
JBoss:
1. 下载Connector/MXJ,将connector-mxj.jar文件拷贝到目录$JBOSS_HOME/server/default/lib。
2. 下载Connector/J,将connector-mxj.jar文件拷贝到目录$JBOSS_HOME/server/default/lib。
3. 有任意属性设置在$JBOSS_HOME/server/default/deploy目录下创建Mbean服务xml文件,例如datadir和autostart。
4. 设置Web应用程序的JDBC参数,以使用:String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql:///test?propertiesTransform="+ "com.mysql.management.jmx.ConnectorMXJPropertiesTransform"; String user = "root"; String password = ""; Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password);
你或许希望为每个应用程序创建单独用户和数据库表空间,而不是使用根用户和测试数据库。
强烈建议定期备份,将数据库文件备份到datadir目录下。