DriverManager只在Tomcat上返回null连接(在Glassfish上正常工作)

问题描述:

几天前将Tomcat 7升级到7.0.26(Centos 7 yum update)后出现了一个奇怪的情况。 DriverManager未能自动识别MySQL驱动程序,并且在servlet部署在Tomcat服务器上时返回空分钟Connection。另一方面,我的NetBeans上的GlassFish服务器工作良好。DriverManager只在Tomcat上返回null连接(在Glassfish上正常工作)

的简单的测试servlet代码是象下面这样:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    response.setContentType("text/html;charset=UTF-8"); 
    try (PrintWriter out = response.getWriter()) 
    { 
     Connection c = MySQLConnector.connect("DBFoobar", "username", "passwd"); 
     String message = null; 
     if (c == null) 
      message = "Connection returned null"; 
     else 
      message = "C is returned: " + c.toString(); 
     out.println("<!DOCTYPE html>"); 
     out.println("<html>"); 
     out.println("<body>"); 
     out.println(message); 
     . 
     . 
     . 

和在MySQLConnector,将jdbc呼叫的定义如下所示:

public class MySQLConnector 
{ 
    private static final String dbURLPrefix 
      = "jdbc:mysql://dbfoobar.xxx.uswest2.rds.amazonaws.com:3306/"; 
    public static Connection connect(String dbName, String username, String password) 
    { 
     Connection connection = null; 
     try 
     { 
      Class.forName("com.mysql.jdbc.Driver"); 
      connection = DriverManager.getConnection(dbURLPrefix + dbName 
       + "?useUnicode=yes&characterEncoding=UTF-8&useSSL=false", username, password); 
      . 
      . 
      . 

当servlet被GlasshFish服务器上,它正确运行显示Connection对象,但在Tomcat服务器上显示Connection returned null消息。

对此的任何想法?到目前为止,我已经尝试将mysql连接器jar文件放在/usr/share/tomcat/lib目录下,但无济于事。 war包正确包含mysql连接器jar文件。以前版本的Tomcat 7运行良好。

+0

它没有返回null。它抛出了一个例外。你的代码返回null,但这是它的错。异常告诉你问题是什么。 – EJP

+0

不,它确实返回null。在禁用SELinux的情况下,它可以正常工作,不会引发任何异常。 – jwsohn

好的。我放弃了。 :)我能找到的唯一的东西如下。我使用CentOS的7

  • 升级从Tomcat 7.0.697.0.76似乎已经打破了Connection代从DriverManager
  • /var/log/yum.log,OpenJDK的(1.8.0)也得到了升级
  • 回复后整个虚拟EC2实例到以前的备份(使用Tomcat 7.0.69),代码运行没有任何问题
  • yum update再次导致以上错误

希望这会有所帮助。

终于找到了答案。这是由于SELinux。我没有检查细节,但SELinux似乎阻止DriveManager执行。我修改了配置文件/etc/selinux/config并禁用了SELinux:

SELINUX=permissive # changed from enforcing