当前位置: 首页 > 文档资料 > MySQL 中文手册 >

26.4. MySQL Connector/MXJ

优质
小牛编辑
133浏览
2023-12-01
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目录下。