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运行良好。
答
好的。我放弃了。 :)我能找到的唯一的东西如下。我使用CentOS的7
- 升级从Tomcat
7.0.69
到7.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
它没有返回null。它抛出了一个例外。你的代码返回null,但这是它的错。异常告诉你问题是什么。 – EJP
不,它确实返回null。在禁用SELinux的情况下,它可以正常工作,不会引发任何异常。 – jwsohn