我写了段连接MySql程序如下:
package connectmysql;/**
 * <p>Title: 连接MySQL数据库</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2005</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */
import java.sql.*;
import com.mysql.jdbc.Driver;public class conSql {    Connection con;
    ResultSet rs;
    Statement stmt;    public conSql() {
        //定义连接类型及连接数据库 ACCESS
        try {
            // Load the JDBC driver
            String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
            Class.forName(driverName);
            //注册MySQL驱动程序
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //数据库名
            String dbName = "bookdb";
            //表名
            String tableName = "books";
            //用户
            String username = "dbuser";
            //口令
            String password = "1234";            String url="jdbc:mysql://localhost/"+dbName;
           //连接MYSQL
            con = DriverManager.getConnection(url,username,password);            con = DriverManager.getConnection(url);
            //创建一个JDBC声明
            stmt = con.createStatement();
        }
        catch (ClassNotFoundException e) {
            // Could not find the database driver
            System.out.println("Could not find the database driver!");
        }
        catch (SQLException e) {
            // Could not connect to the database
            System.out.println("Could not connect to the database!");
            System.err.println(e.getMessage());
        }    }    //定义数据库执行返回值 RS;
    public ResultSet getResult(String strSQL) {
        try {
            rs = stmt.executeQuery(strSQL);
            return rs;
        }
        catch (SQLException sqle) {
            System.out.println(sqle.toString());
            return null;
        }
    }    //定义数据库修改保存类
    public boolean updateSql(String strSQL) {
        try {
            stmt.executeUpdate(strSQL);
            con.commit();
            return true;        }
        catch (SQLException sqle) {
            System.out.println(sqle.toString());
            return false;
        }
    }    //定义关闭数据库类
    public void closeConnection() {
        try {
            stmt.close();
            con.close();
        }
        catch (SQLException sqle) {
            System.out.println(sqle.toString());
        }
    }    //显示整个表
    public void showTable(){
        try {
            rs = stmt.executeQuery("SELECT * FROM books");
            ResultSetMetaData rsmd = rs.getMetaData();
            int numberOfColumns = rsmd.getColumnCount();
            while (rs.next()) {
                for (int i = 1; i <= numberOfColumns; i++) {
                    if (i > 1)
                        //用逗号分隔各列
                        System.out.print(", ");                    String columnValue = rs.getString(i);
                    System.out.print(columnValue);
                }
                System.out.println("");
            }            closeConnection();
        }
        catch (Exception ex) {
            System.err.print("Exception: ");
            System.err.println(ex.getMessage());
        }
    }    //主程序
    public static void main(String[] args) {
        conSql da = new conSql();
        da.showTable();    }
}结果执行时报连接错误如下:
Communication link failure: java.io.IOException, underlying cause: Unexpected end of input stream** BEGIN NESTED EXCEPTION ** java.io.IOException
MESSAGE: Unexpected end of input streamSTACKTRACE:java.io.IOException: Unexpected end of input stream at com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:1096) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:626) at com.mysql.jdbc.Connection.createNewIO(Connection.java:1562) at com.mysql.jdbc.Connection.<init>(Connection.java:491) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346) at java.sql.DriverManager.getConnection(DriverManager.java:512) at java.sql.DriverManager.getConnection(DriverManager.java:171) at connectmysql.conSql.<init>(conSql.java:39) at connectmysql.conSql.main(conSql.java:122)** END NESTED EXCEPTION **Could not connect to the database!Exception: null但我的MySQL5.0版本完全正常,且我可以从cmd中登录并操作MySQL,开机时就把MySQL服务给启动了,为什么在程序中就不行,让我困扰了好久,请大虾们赐教!!!

解决方案 »

  1.   

    会不会是端口问题,mysql默认是3306
      

  2.   

    con = DriverManager.getConnection(url,username,password);            con = DriverManager.getConnection(url);
    为什么连两次?把下面的去掉。
      

  3.   

    首先,我想应该不是连两次的问题,异常是在第一次抛出的。
    其次,如何将3306的端口加上?!我把url改成
    String url="jdbc:mysql://localhost:3306/"+dbName;
    也是不行。我想是不是连接类没有注册上?因为在异常中有at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346)
    这样的错误。希望大家再出出力!
      

  4.   

    我出现过com.mysql.jdbc.NonRegisteringDriver.connect,是因为我没有将
    mysql-connector-java-3.1.10-bin.jar加入classpath
      

  5.   

    把mysql的driver放到你的应用的lib中
      

  6.   

    NonRegisteringDriver.java:346显然是没有找到驱动程序!该怎么办我想你应该知道吧 ?
      

  7.   

    把mysql的driver放到你的应用的lib中-------------------可能是这个问题,楼主把驱动包放到WEB-INF/lib/下面试试看
      

  8.   

    曾经我也希望是没有加入驱动,但是mysql-connector-java-3.1.10-bin.jar和mysql-connector-java-3.1.10-bin-g.jar我都加入lib并配置了,mysqldriver.jar我也第一时间就加入了,我知道错误报的是没有找到,但是jdk中都有啊,环境变量也有。非常郁闷!!!
      

  9.   

    //注册MySQL驱动程序
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        这句不是多此一举吗?不知楼主从哪里学的?
    ***************************************    con = DriverManager.getConnection(url,username,password);
        con = DriverManager.getConnection(url);
        也不要两次.    把驱动程序的JAR文件拷进去.
    ***********************
    下面是我的屡试不爽例子.public static final String DRIVER = 
    "com.mysql.jdbc.Driver";
    public static final String DBURL = 
    "jdbc:mysql://localhost/Jive?useEncoding=true&characterEncoding=iso8859-1";//加载驱动程序
    Class.forName(DRIVER);
    Connection con = con = DriverManager.getConnection(DBURL,"user","pass");
      

  10.   

    知道,楼上所说我都注意的到,但为了确保注册驱动,我使用了
    //注册MySQL驱动程序
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    至于连接两次,我没把注释加上来,是我的疏忽。但是按楼上所说连接方法,还是报错:
    Communication link failure: java.io.IOException, underlying cause: Unexpected end of input stream再把连接代码发一下,请大家关注
     public conSql() {
            //定义连接类型及连接数据库 ACCESS
            try {
                // Load the JDBC driver
                String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
                Class.forName(driverName);            
                //数据库名
                String dbName = "mysql";
                //表名
                String tableName = "user";
                //用户
                String username = "dbuser";
                //口令
                String password = "1234";            String url="jdbc:mysql://localhost/mysql?useEncoding=true&characterEncoding=iso8859-1";           //连接MYSQL
                con = DriverManager.getConnection(url,username,password);
                //创建一个JDBC声明
                stmt = con.createStatement();
            }
            catch (ClassNotFoundException e) {
                // Could not find the database driver
                System.out.println("Could not find the database driver!");
            }
            catch (SQLException e) {
                // Could not connect to the database
                System.out.println("Could not connect to the database!");
                System.err.println(e.getMessage());
            }    }注明:mysql-connector-java-3.1.10-bin.jar和mysql-connector-java-3.1.10-bin-g.jar我都加入lib并配置了环境变量,mysqldriver.jar我也第一时间就加入了,所用jdk是jbuilder自带,且在外部连接mysql完全正常。
      

  11.   

    我前段时间给朋友写了一个JDBC连接MySql的例子类。使用没有问题,不过没有进行池化处理,希望对你有帮助。你上传的源码我看了,有一点必须提醒你在进行JDBC操作时当用完ResultSet(即rs记录)记录集后一定要调用“rs.close()”方法来关闭否则会出现游标用尽或数据库资源用尽等错误(到时候就必须重新起数据库服务器)。还有一点应实现说明,我起初写这个例子的时候直接应用的MySql JDBC驱动的jar包,总是出现驱动加载失败的错误,最后我将jar包解开后问题解决,也许你的问题就是这个。好就说这些,以下是我的源码仅供参考:package dbconn;
    import java.sql.*; 
    import java.io.*; 
     /**
     * <p>数据库连接Bean</p>
     * <p>进行数据库操作</p>
     * 执行查询操作流程:SQL查询调用方法 ResultSet rs = querySQL(String SQL),插入、修改和删除调用方法execSQL(String sql)。
     * 操作完成后,调用close()的方法关闭记录集和连接。
     * <p>MySql JDBC连接串说明 url格式:jdbc:mysql://[hostname][:port]/dbname[?param1=value1][&para;m2=value2]...</p>
     * <p>备注:在执行SQL查询、插入、修改和删除时会自己创建数据库连接</p>
     * <p>Copyright: Copyright (c) 2005</p>
     * <p>Company: </p>
     * @author 
     * @version 1.0
    */
    public class  connDB
    {
    final String SerIp="127.0.0.1";//服务器IP地址
    final String DBName="test";//服务器IP地址
    final String sDBDriver = "org.gjt.mm.mysql.Driver"; //MySql JDBC驱动串
    final String UserID="root";//数据库用户名
    final String Password="";//数据库密码
    String sConnStr = ""; //连接字符串
    static Connection conn=null;//以静态形式定义
    static Statement stmt=null;//以静态形式定义
    static ResultSet rs = null;//以静态形式定义   /**
       * <p>Method:构造方法</p>
       */
    public connDB() {
    sConnStr = "jdbc:mysql://"+SerIp+"/"+DBName; //创建数据库连接字符串
    }  /**
       * <p>Method:CreatDB()</p>
       * <p>Description:创建数据库连接,同时返回一个连接。如果失败屏幕输出“Create False”,否则为“Create True”.如果是程序执行失败抛出ERROR返回null</p>
       * @params 无
       * @return Connection 返回一个连接
       */
       public Connection CreatDB(){
       try{
    Class.forName(sDBDriver);//加载数据库驱动
    try{
    conn=DriverManager.getConnection(sConnStr, UserID, Password);//得到一个连接
    System.out.println("Create True");
    return conn;
    }catch(Exception e){System.out.println("Create False--得到数据库连接错:"+e.getMessage());return conn;}
       }catch(Exception e){System.out.println("Create False--加载数据库驱动错:"+e.getMessage());return conn;}
       }  /**
       * <p>Method:querySQL(String SQL)</p>
       * <p>Description:执行一条SQL,返回记录集,抛出异常</p>
       * @params String SQL-所执行的sql语句
       * @return ResultSet rs-返回RS数据集>
       */
    public ResultSet querySQL(String sql) throws Exception{
    if(conn==null)
    conn=CreatDB();
    try { 
    if(rs!=null){
    rs.close();
    rs=null;
    }
    if(stmt!=null){
    stmt.close();
    stmt=null;
    }
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE); 
    rs = stmt.executeQuery(sql); //执行SQL
    }catch(Exception e)
    {System.out.println("得到RS记录集错: " + e.getMessage()); }
    return rs; 
    }  /**
       * <p>Method:executeQuery(String sql)</p>
       * <p>Description:执行一条SQL,抛出异常</p>
       * @params String SQL-所执行的sql语句
       * @return 无
       */
    public void executeQuery(String sql) throws Exception{
    if(conn==null)
    conn=CreatDB();
    try { 
    if(rs!=null){
    rs.close();
    rs=null;
    }
    if(stmt!=null){
    stmt.close();
    stmt=null;
    }
    stmt = conn.createStatement(); 
    stmt.executeUpdate(sql);
    }catch(Exception e)
    {System.out.println("插入记录集错: " + e.getMessage()); }
    }  /**
       * <p>Method:getMaxID(String tab, String col)</p>
       * <p>Description:得到列最大值加1,用于主键添加</p>
       * @params String tab 表明
       * @params String col字段明 <b>备注:字段类型必须为整型或长整型</b>
       * @return long 返回长整型ID号>
       */
    public long getMaxID(String tab, String col) throws Exception{
    long maxid=0;
    if(conn==null)
    conn=CreatDB();
    try { 
    if(rs!=null){
    rs.close();
    rs=null;
    }
    if(stmt!=null){
    stmt.close();
    stmt=null;
    }
    String sql = String.valueOf(String.valueOf( (new StringBuffer("select max(")).append(col).append(") from ").append(tab).append("")));
    stmt = conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE); 
    rs = stmt.executeQuery(sql); //执行SQL
        if (rs != null) {
    rs.next();
    maxid = rs.getLong(1)+1;
    }
    }catch(Exception e)
    {System.out.println("得到RS记录集错: " + e.getMessage()); }
    return maxid; 
    }  /**
       * <p>Method:close()</p>
       * <p>Description:关闭连接以及RS数据集,抛出异常</p>
       * @params 无
       * @return 无
       */
    public void close() throws Exception{
    try { 
    if(rs!=null){
    rs.close();
    rs=null;
    }
    if(stmt!=null){
    stmt.close();
    stmt=null;
    }
    if(conn!=null){
    conn.close();
    conn=null;
    }
    System.out.println("连接已关闭");
    }catch(SQLException e)
    {System.err.println("关闭连接错: " + e.getMessage()); }
    }}
      

  12.   

    我是这样做的,不知道对你有没有帮助1、先把下载来的connector.jar放到jsdk/lib/下,然后配制环境,加入这个jar文件的路径,不是目录的路径。
    2、然后重新启动你的机器
    3、String url="jdbc:mysql://localhost/jxgl";
    4、最好你上面的那个connector.jar文件名修改一下,用短点的。
    5、连接的库文件最好从这个地址下载:http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-3.1.10.zip/from/http://mysql.isu.edu.tw/
    下载后得到的文件中,只要用mysql-connector-java-3.1.10-bin.jar这个文件就好了。
      

  13.   

    上次碰到的问题就是连接数据库的jar包版本低,下个新的试试
      

  14.   

    问题解决了,是在试验中发现删除环境变量classpath中的内容就正常连接了。classpath内的内容是jdk/lib中的jar包,这里作为大家的参考,感谢大家。