MysqlDataSource.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:10k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.       This program is free software; you can redistribute it and/or modify
  4.       it under the terms of the GNU General Public License as published by
  5.       the Free Software Foundation; either version 2 of the License, or
  6.       (at your option) any later version.
  7.       This program is distributed in the hope that it will be useful,
  8.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.       GNU General Public License for more details.
  11.       You should have received a copy of the GNU General Public License
  12.       along with this program; if not, write to the Free Software
  13.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  */
  15. package com.mysql.jdbc.jdbc2.optional;
  16. import java.io.PrintWriter;
  17. import java.io.Serializable;
  18. import java.sql.SQLException;
  19. import java.util.Properties;
  20. import javax.naming.NamingException;
  21. import javax.naming.Reference;
  22. import javax.naming.Referenceable;
  23. import javax.naming.StringRefAddr;
  24. import javax.sql.DataSource;
  25. /**
  26.  * A JNDI DataSource for a Mysql JDBC connection
  27.  *
  28.  * @author Mark Matthews
  29.  */
  30. public class MysqlDataSource implements DataSource, Referenceable, Serializable {
  31.     /** The driver to create connections with */
  32.     protected static com.mysql.jdbc.Driver mysqlDriver = null;
  33.     static {
  34.         try {
  35.             mysqlDriver = (com.mysql.jdbc.Driver) Class.forName(
  36.                     "com.mysql.jdbc.Driver").newInstance();
  37.         } catch (Exception E) {
  38.             throw new RuntimeException(
  39.                 "Can not load Driver class com.mysql.jdbc.Driver");
  40.         }
  41.     }
  42.     /** Log stream */
  43.     protected PrintWriter logWriter = null;
  44.     /** Database Name */
  45.     protected String databaseName = null;
  46.     /** Character Encoding */
  47.     protected String encoding = null;
  48.     /** Hostname */
  49.     protected String hostName = null;
  50.     /** Password */
  51.     protected String password = null;
  52.     /** The profileSql property */
  53.     protected String profileSql = "false";
  54.     /** The JDBC URL */
  55.     protected String url = null;
  56.     /** User name */
  57.     protected String user = null;
  58.     /** Should we construct the URL, or has it been set explicitly */
  59.     protected boolean explicitUrl = false;
  60.     /** Port number */
  61.     protected int port = 3306;
  62.     /**
  63.      * Default no-arg constructor for Serialization
  64.      */
  65.     public MysqlDataSource() {
  66.     }
  67.     /**
  68.      * Creates a new connection using the already configured username and
  69.      * password.
  70.      *
  71.      * @return a connection to the database
  72.      *
  73.      * @throws SQLException if an error occurs
  74.      */
  75.     public java.sql.Connection getConnection() throws SQLException {
  76.         return getConnection(user, password);
  77.     }
  78.     /**
  79.      * Creates a new connection with the given username and password
  80.      *
  81.      * @param userID the user id to connect with
  82.      * @param password the password to connect with
  83.      *
  84.      * @return a connection to the database
  85.      *
  86.      * @throws SQLException if an error occurs
  87.      */
  88.     public java.sql.Connection getConnection(String userID, String password)
  89.         throws SQLException {
  90.         Properties props = new Properties();
  91.         if (userID == null) {
  92.             userID = "";
  93.         }
  94.         if (password == null) {
  95.             password = "";
  96.         }
  97.         props.put("user", userID);
  98.         props.put("password", password);
  99.         props.put("profileSql", getProfileSql());
  100.         return getConnection(props);
  101.     }
  102.     /**
  103.      * Sets the database name.
  104.      *
  105.      * @param dbName the name of the database
  106.      */
  107.     public void setDatabaseName(String dbName) {
  108.         databaseName = dbName;
  109.     }
  110.     /**
  111.      * Gets the name of the database
  112.      *
  113.      * @return the name of the database for this data source
  114.      */
  115.     public String getDatabaseName() {
  116.         return (databaseName != null) ? databaseName : "";
  117.     }
  118.     /**
  119.      * Sets the log writer for this data source.
  120.      *
  121.      * @see javax.sql.DataSource#setLogWriter(PrintWriter)
  122.      */
  123.     public void setLogWriter(PrintWriter output) throws SQLException {
  124.         logWriter = output;
  125.     }
  126.     /**
  127.      * Returns the log writer for this data source
  128.      *
  129.      * @return the log writer for this data source
  130.      */
  131.     public java.io.PrintWriter getLogWriter() {
  132.         return logWriter;
  133.     }
  134.     /**
  135.      * DOCUMENT ME!
  136.      *
  137.      * @param seconds DOCUMENT ME!
  138.      *
  139.      * @throws SQLException DOCUMENT ME!
  140.      */
  141.     public void setLoginTimeout(int seconds) throws SQLException {
  142.     }
  143.     /**
  144.      * Returns the login timeout
  145.      *
  146.      * @return the login timeout
  147.      */
  148.     public int getLoginTimeout() {
  149.         return 0;
  150.     }
  151.     /**
  152.      * Sets the password
  153.      *
  154.      * @param pass the password
  155.      */
  156.     public void setPassword(String pass) {
  157.         password = pass;
  158.     }
  159.     /**
  160.      * Sets the database port.
  161.      *
  162.      * @param p the port
  163.      */
  164.     public void setPort(int p) {
  165.         port = p;
  166.     }
  167.     /**
  168.      * Returns the port number
  169.      *
  170.      * @return the port number
  171.      */
  172.     public int getPort() {
  173.         return port;
  174.     }
  175.     /**
  176.      * Sets the port number
  177.      *
  178.      * @param p the port
  179.      *
  180.      * @see #setPort
  181.      */
  182.     public void setPortNumber(int p) {
  183.         setPort(p);
  184.     }
  185.     /**
  186.      * Returns the port number
  187.      *
  188.      * @return the port number
  189.      */
  190.     public int getPortNumber() {
  191.         return getPort();
  192.     }
  193.     /**
  194.      * Sets the profileSql property
  195.      *
  196.      * @param flag true/false
  197.      */
  198.     public void setProfileSql(String flag) {
  199.         profileSql = flag;
  200.     }
  201.     /**
  202.      * Returns the value for the profileSql property
  203.      *
  204.      * @return the value for the profileSql property
  205.      */
  206.     public String getProfileSql() {
  207.         return profileSql;
  208.     }
  209.     /**
  210.      * Required method to support this class as a <CODE>Referenceable</CODE>.
  211.      *
  212.      * @return a Reference to this data source
  213.      *
  214.      * @throws NamingException if a JNDI error occurs
  215.      */
  216.     public Reference getReference() throws NamingException {
  217.         String factoryName = "com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory";
  218.         Reference ref = new Reference(getClass().getName(), factoryName, null);
  219.         ref.add(new StringRefAddr("user", getUser()));
  220.         ref.add(new StringRefAddr("password", password));
  221.         ref.add(new StringRefAddr("serverName", getServerName()));
  222.         ref.add(new StringRefAddr("port", "" + getPort()));
  223.         ref.add(new StringRefAddr("databaseName", getDatabaseName()));
  224.         ref.add(new StringRefAddr("profileSql", getProfileSql()));
  225.         return ref;
  226.     }
  227.     /**
  228.      * Sets the server name.
  229.      *
  230.      * @param serverName the server name
  231.      */
  232.     public void setServerName(String serverName) {
  233.         hostName = serverName;
  234.     }
  235.     /**
  236.      * Returns the name of the database server
  237.      *
  238.      * @return the name of the database server
  239.      */
  240.     public String getServerName() {
  241.         return (hostName != null) ? hostName : "";
  242.     }
  243.     //
  244.     // I've seen application servers use both formats
  245.     // URL or url (doh)
  246.     //
  247.     /**
  248.      * Sets the URL for this connection
  249.      *
  250.      * @param url the URL for this connection
  251.      */
  252.     public void setURL(String url) {
  253.         setUrl(url);
  254.     }
  255.     /**
  256.      * Returns the URL for this connection
  257.      *
  258.      * @return the URL for this connection
  259.      */
  260.     public String getURL() {
  261.         return getUrl();
  262.     }
  263.     /**
  264.      * This method is used by the app server to set the url string specified
  265.      * within the datasource deployment descriptor.  It is discovered using
  266.      * introspection and matches if property name in descriptor is "url".
  267.      *
  268.      * @param url url to be used within driver.connect
  269.      */
  270.     public void setUrl(String url) {
  271.         this.url = url;
  272.         explicitUrl = true;
  273.     }
  274.     /**
  275.      * Returns  the   JDBC URL that will be used to create the database
  276.      * connection.
  277.      *
  278.      * @return the URL for this connection
  279.      */
  280.     public String getUrl() {
  281.         if (!explicitUrl) {
  282.             String builtUrl = "jdbc:mysql://";
  283.             builtUrl = builtUrl + getServerName() + ":" + getPort() + "/"
  284.                 + getDatabaseName();
  285.             return builtUrl;
  286.         } else {
  287.             return this.url;
  288.         }
  289.     }
  290.     /**
  291.      * Sets the user ID.
  292.      *
  293.      * @param userID the User ID
  294.      */
  295.     public void setUser(String userID) {
  296.         user = userID;
  297.     }
  298.     /**
  299.      * Returns the  configured user for this connection
  300.      *
  301.      * @return the user for this connection
  302.      */
  303.     public String getUser() {
  304.         return user;
  305.     }
  306.     /**
  307.      * Creates a connection using the specified properties.
  308.      *
  309.      * @param props the properties to connect with
  310.      *
  311.      * @return a connection to the database
  312.      *
  313.      * @throws SQLException if an error occurs
  314.      */
  315.     protected java.sql.Connection getConnection(Properties props)
  316.         throws SQLException {
  317.         String jdbcUrlToUse = null;
  318.         if (!explicitUrl) {
  319.             StringBuffer jdbcUrl = new StringBuffer("jdbc:mysql://");
  320.             if (hostName != null) {
  321.                 jdbcUrl.append(hostName);
  322.             }
  323.             jdbcUrl.append(":");
  324.             jdbcUrl.append(port);
  325.             jdbcUrl.append("/");
  326.             if (databaseName != null) {
  327.                 jdbcUrl.append(databaseName);
  328.             }
  329.             jdbcUrlToUse = jdbcUrl.toString();
  330.         } else {
  331.             jdbcUrlToUse = this.url;
  332.         }
  333.         return mysqlDriver.connect(jdbcUrlToUse, props);
  334.     }
  335. }