今天做数据库实验,使用 DBCP 数据库连接池连接 MySQL(Ver 14.14 Distrib 5.5.18)。测试代码很简单:
// ConnectingToMySQL.java-
import java.sql.*;
-
import org.apache.commons.dbcp.BasicDataSource;
-
-
public class ConnectingToMySQL {
-
public static void main(String[] args) {
-
BasicDataSource bds = new BasicDataSource();
-
bds.setDriverClassName("com.mysql.jdbc.Driver");
-
bds.setUrl("jdbc:mysql://localhost:3306/test");
-
bds.setUsername("root");
-
bds.setPassword("");
-
try {
-
System.out.println("Trying to connect!!");
-
Connection con = bds.getConnection();
-
System.out.println("Connected sucessfully !!");
-
con.close();
-
} catch (SQLException s) {
-
System.out.println("SQL code does not execute.");
-
}
-
}
-
}
将
- commons-collections-3.2.1.jar,
-
commons-dbcp-1.4.jar,
-
commons-pool-1.5.6.jar,
-
mysql-connector-java-5.1.18-bin.jar
几个文件复制到 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/ 中。
编译代码:
- $ javac ConnectingToMySQL.java
运行程序:
结果如下:
竟然是执行失败!
确认 mysql 服务已经运行,再查看端口,发现居然没有程序监听 3306 端口!
在 mysql 提示符下运行
- mysql> show variables like 'port';
结果却是 port 为 0!诡异!怎么回事?明明配置文件中设置监听端口为 3306 的。
于是开始了网上艰苦的搜寻,千山万水的跋涉之后,终于在
看到了一丝曙光,好象和什么 named_pipe 相关。
显然,这个对我来说,有点太深奥了,不懂。不过总算有了眉目,姑且一试。
查看 mysql 的配置文件 /etc/mysql/my.cnf,搜索 pipe 单词,终于发现了个中玄机:
- # Don't listen on a TCP/IP port at all. This can be a security enhancement,
-
# if all processes that need to connect to mysqld run on the same host.
-
# All interaction with mysqld must be made via Unix sockets or named pipes.
-
# Note that using this option without enabling named pipes on Windows
-
# (via the "enable-named-pipe" option) will render mysqld useless!
-
#
-
skip-networking
可见,为了安全,mysql 默认关闭了 TCP/IP 监听。
将 skip-networking 这一行注释掉,即打开 mysql 的端口监听,然后重启 mysql 服务。
此时使用 lsof 命令查看 3306 端口,可以看到 mysql 进程。
再运行测试程序:
成功!搞定!
后记:
我在网上搜索端口号这个问题时,看到有人说使用 mysql 的 root 用户时,不可以在外部连接数据库,于是我连忙新建了个用户。又说,mysql 的 root 用户密码不能为空,于是我又赶紧给设了个密码。可惜却都未能解决问题。
我很奇怪为什么其他人使用 DBCP 连接 mysql 时没有遇到这个问题呢,因为我搜索『mysql 端口号为 0』,返回的搜索结果很少。或许,他们的默认配置文件不同吧。
阅读(835) | 评论(0) | 转发(0) |