Java项目放在Linux(Ubuntu)上无法连接数据库

远来客 2018-10-19 03:54:35
在MyEclipse做完项目以后,放置服务器的tomcat中(War格式),启动tomcat,项目可以通过url访问,但是有数据库操作时会返回空指针异常,说明数据库连接失败,将项目放在tomcat中是需要什么操作的吗?
又没有人指教一下,谢谢!
------------------------------------------------------------------------------------------------------------------
JDBC代码:

package com.yang.Dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class BaseDaoMysql {
protected String driver = "com.mysql.jdbc.Driver";
protected String url = "jdbc:mysql://localhost:3306/bookshop";
protected Connection conn = null;
protected PreparedStatement ps = null;
protected ResultSet rs = null;
protected int result = 0;

public void closeall(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (conn != null)
conn.close();
} catch (SQLException e) {

e.printStackTrace();
}
}

public Connection getConnection(){
try{if(conn == null || conn.isClosed()){
Class.forName(driver);
conn = DriverManager.getConnection(url,"root","qq971024");
}
}catch (SQLException e) {

e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}

public void optimize(String sql,Object[] param){
try {
conn = getConnection();
ps = conn.prepareStatement(sql);
if(param != null){
for(int i= 0; i < param.length;i++){
ps.setObject((i+1),param[i]);
}
}
result = ps.executeUpdate();
}catch (SQLException e) {
e.printStackTrace();
}finally{
closeall(conn,ps,rs);
}
}

public String getDriver() {
return driver;
}

public void setDriver(String driver) {
this.driver = driver;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public Connection getConn() {
return conn;
}

public void setConn(Connection conn) {
this.conn = conn;
}

public PreparedStatement getPs() {
return ps;
}

public void setPs(PreparedStatement ps) {
this.ps = ps;
}

public ResultSet getRs() {
return rs;
}

public void setRs(ResultSet rs) {
this.rs = rs;
}

public int getResult() {
return result;
}

public void setResult(int result) {
this.result = result;
}
}
...全文
984 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
远来客 2018-12-29
  • 打赏
  • 举报
回复
感谢各位大神,虽然没解决不知道是什么问题,但是通过学习SSH框架以后用框架搭建就没有问题了
远来客 2018-11-30
  • 打赏
  • 举报
回复
不知道是不是JDBC的BUG,换了Hibernate框架就好了
定海神针铁 2018-10-25
  • 打赏
  • 举报
回复
感觉说的好深奥的样子,我看出了一个错误,SQL语句貌似不能加分号
小灰狼 2018-10-24
  • 打赏
  • 举报
回复
数据库连接失败,底层一定会有异常抛出,并且这种异常都是非 RuntimeException,要求程序一定要捕捉的
连接失败的异常给出的信息一般是准确的,提供的线索足以指导你如何排查错误

对异常,千万不要直接捕捉然后忽略,要写到异常日志中,否则系统出现错误你根本无从查起。设计好的系统框架,应该有完善的异常管理机制。

怀疑楼主对底层抛出的异常捕捉并且忽略了
Justin~ 2018-10-24
  • 打赏
  • 举报
回复
在ubuntu里用ifconfig命令查看ip地址,然后把localhost改为相应的ip地址就可以了(前提是桥接网络)
ooo-ooo 2018-10-24
  • 打赏
  • 举报
回复
引用 36 楼 oliver_105397 的回复:
[quote=引用 18 楼 qq_25992675 的回复:] [quote=引用 17 楼 oliver_105397 的回复:] mysql的端口看下对不对,不一定默认就是3306的
端口是对的,有人和我说是未识别jdbc:mysql://localhost:3306/email中的localhost,当我把localhost换成IP地址的时候还是不行,应该是无法通过IP地址连接Mysql,请问怎么设置通过IP可以访问Mysql啊?Linux(Ubuntu)系统[/quote]

一、root用户登录进入命令行
二、
    use mysql;
    select user,host from user;
    update user set host='%' where user='root';
    flush privileges;
三、
    以账号密码链接:
        GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
        flush privileges;
		
    指定ip链接:
        GRANT ALL PRIVILEGES ON *.* TO 'tuser'@'192.168.1.1' IDENTIFIED BY 'tpwd' WITH GRANT OP
        flush privileges;
[/quote] 打漏了字母ip链接那里最后还是:OPTION
ooo-ooo 2018-10-24
  • 打赏
  • 举报
回复
引用 18 楼 qq_25992675 的回复:
[quote=引用 17 楼 oliver_105397 的回复:] mysql的端口看下对不对,不一定默认就是3306的
端口是对的,有人和我说是未识别jdbc:mysql://localhost:3306/email中的localhost,当我把localhost换成IP地址的时候还是不行,应该是无法通过IP地址连接Mysql,请问怎么设置通过IP可以访问Mysql啊?Linux(Ubuntu)系统[/quote]

一、root用户登录进入命令行
二、
    use mysql;
    select user,host from user;
    update user set host='%' where user='root';
    flush privileges;
三、
    以账号密码链接:
        GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
        flush privileges;
		
    指定ip链接:
        GRANT ALL PRIVILEGES ON *.* TO 'tuser'@'192.168.1.1' IDENTIFIED BY 'tpwd' WITH GRANT OP
        flush privileges;
楓VS痕 2018-10-23
  • 打赏
  • 举报
回复
如果确定第19行是:ps = conn.prepareStatement(sql);
那就应该是数据库连接失败,conn对象为空。
在BaseDaoMysql类中,修改一下getConnection()方法,看看数据库是否连接成功,如下所示:

public Connection getConnection() {
try {
if (conn == null || conn.isClosed()) {
Class.forName(driver);
conn = DriverManager.getConnection(url, "root", "qq971024");
}
} catch (SQLException e) {

e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("数据库连接对象为:" + conn);
return conn;
}
小灰狼 2018-10-23
  • 打赏
  • 举报
回复
引用 22 楼 qq_25992675 的回复:
[quote=引用 20 楼 weixin_43489734 的回复:]
这个技术非常实用,值得学习~!

19行是这一行[/quote]

如果是这一行报空指针异常,就一定是 conn = null。一个方法返回一个空值,然后赋给一个变量是不可能报空指针异常的。
所以肯定是 getConnection 方法返回了 null

楼主应该从这里找
nayi_224 2018-10-23
  • 打赏
  • 举报
回复
引用 22 楼 qq_25992675 的回复:
[quote=引用 20 楼 weixin_43489734 的回复:] 这个技术非常实用,值得学习~!
19行是这一行[/quote] 这一行报空指针的话,可以确定是conn为Null了。 对于这样的方法
	public Connection getConnection() {
		try {
			if (conn == null || conn.isClosed()) {
				Class.forName(driver);
				conn = DriverManager.getConnection(url, "root", "qq971024");
			}
		} catch (SQLException e) {

			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return conn;
	}
在返回空之前,必定会先报一个SQLException 或者ClassNotFoundException 。感觉是报错日志没打全吧。日志等级调一下,或者直接看服务器上的tomcat日志,应该有新发现。
小灰狼 2018-10-23
  • 打赏
  • 举报
回复
个人感觉, conn.prepareStatement 不可能返回 null
楼主说的 19 行到底是哪一行?
是 ps = conn.prepareStatement,还是 for 语句?

如果是 ps = conn.prepareStatement 出现空指针异常,那么就应该是 conn = null,从而推断 getConnection() 返回了 null
远来客 2018-10-23
  • 打赏
  • 举报
回复
引用 23 楼 qq_25992675 的回复:
[quote=引用 22 楼 qq_25992675 的回复:]
[quote=引用 20 楼 weixin_43489734 的回复:]
这个技术非常实用,值得学习~!

19行是这一行[/quote]

试过了呢,并没有用,我将localhost改成我的IP地址,然后换了一个项目,结果还是一样


[/quote]
远来客 2018-10-23
  • 打赏
  • 举报
回复
引用 22 楼 qq_25992675 的回复:
[quote=引用 20 楼 weixin_43489734 的回复:]
这个技术非常实用,值得学习~!

19行是这一行[/quote]

试过了呢,并没有用,我将localhost改成我的IP地址,然后换了一个项目,结果还是一样


远来客 2018-10-23
  • 打赏
  • 举报
回复
引用 20 楼 weixin_43489734 的回复:
这个技术非常实用,值得学习~!

19行是这一行
qq_43241107 2018-10-23
  • 打赏
  • 举报
回复
数据库在linux上面的话,直接将locahst改为数据库安装的机器IP地址
楓VS痕 2018-10-23
  • 打赏
  • 举报
回复
引用 30 楼 qq_25992675 的回复:
[quote=引用 28 楼 xiewu91124 的回复:]
如果确定第19行是:ps = conn.prepareStatement(sql);
那就应该是数据库连接失败,conn对象为空。
在BaseDaoMysql类中,修改一下getConnection()方法,看看数据库是否连接成功,如下所示:

public Connection getConnection() {
try {
if (conn == null || conn.isClosed()) {
Class.forName(driver);
conn = DriverManager.getConnection(url, "root", "qq971024");
}
} catch (SQLException e) {

e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("数据库连接对象为:" + conn);
return conn;
}
并没有在服务器安装编译工具,是直接将项目以War方式拷贝过去的,所以打印也接受不到结果的[/quote]

一般来说,System.out.println 的内容,会写入到Tomcat的日志文件 catalina.out 中。
千秋无痕 2018-10-23
  • 打赏
  • 举报
回复
连接部分的代码日志,被你吞掉了,e.printtrace这些信息不会被写到日志文件中;

linux运行有没有控制台,这些日志算是飞了;

你完善下代码,重新运行,看下错误日志;
nayi_224 2018-10-23
  • 打赏
  • 举报
回复
引用 31 楼 qq_25992675 的回复:
[quote=引用 26 楼 nayi_224 的回复:] [quote=引用 22 楼 qq_25992675 的回复:] [quote=引用 20 楼 weixin_43489734 的回复:] 这个技术非常实用,值得学习~!
19行是这一行[/quote] 这一行报空指针的话,可以确定是conn为Null了。 对于这样的方法
	public Connection getConnection() {
		try {
			if (conn == null || conn.isClosed()) {
				Class.forName(driver);
				conn = DriverManager.getConnection(url, "root", "qq971024");
			}
		} catch (SQLException e) {

			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return conn;
	}
在返回空之前,必定会先报一个SQLException 或者ClassNotFoundException 。感觉是报错日志没打全吧。日志等级调一下,或者直接看服务器上的tomcat日志,应该有新发现。[/quote] 能不能教下啊?刚接触Linux呢,还不太会,而且是没有界面的Ubuntu系统,不知道怎么查看日志[/quote] 查看tomcat路径 ps -ef|grep tomcat 查看日志 tail -f /tomcat路径/logs/catalina.out war最终也是会解压成文件。测试的话,直接替换.class文件,再重启就行了。可以在BaseDaoMysql类中多写几个System.out.print来调试。
远来客 2018-10-23
  • 打赏
  • 举报
回复
引用 27 楼 hemowolf 的回复:
[quote=引用 22 楼 qq_25992675 的回复:]
[quote=引用 20 楼 weixin_43489734 的回复:]
这个技术非常实用,值得学习~!

19行是这一行[/quote]

如果是这一行报空指针异常,就一定是 conn = null。一个方法返回一个空值,然后赋给一个变量是不可能报空指针异常的。
所以肯定是 getConnection 方法返回了 null

楼主应该从这里找[/quote]
听起来好像有点道理
远来客 2018-10-23
  • 打赏
  • 举报
回复
引用 26 楼 nayi_224 的回复:
[quote=引用 22 楼 qq_25992675 的回复:]
[quote=引用 20 楼 weixin_43489734 的回复:]
这个技术非常实用,值得学习~!

19行是这一行[/quote]

这一行报空指针的话,可以确定是conn为Null了。
对于这样的方法
	public Connection getConnection() {
try {
if (conn == null || conn.isClosed()) {
Class.forName(driver);
conn = DriverManager.getConnection(url, "root", "qq971024");
}
} catch (SQLException e) {

e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}

在返回空之前,必定会先报一个SQLException 或者ClassNotFoundException 。感觉是报错日志没打全吧。日志等级调一下,或者直接看服务器上的tomcat日志,应该有新发现。[/quote]

能不能教下啊?刚接触Linux呢,还不太会,而且是没有界面的Ubuntu系统,不知道怎么查看日志
加载更多回复(22)

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧