1. java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
......
2. Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: CTT
......
3. java.lang.NullPointerException: Cannot invoke "java.sql.Connection.prepareStatement(String)" because "this.conn" is null
......
在注册界面填好表单提交后程序报错了,一开始眼瞎只关注到上面的第一句和第三句错误,因为中间报错的地方太多了导致控制台满满的一大片爆红,所以只看到了跟数据库连接不上有关的字眼,的确这是主要原因,然后我就花了大半天时间一直在csdn找解决方案,但就是没有跟我遇到完全一样问题的答案,上面的解决方案无非就是mysql的架包版本问题、未将架包加入到TomCat的lib目录下等问题,关键我们又不是第一次使用JDBC了,这些问题早在第一次连接数据库时就应该解决了的。后来还是看的书,逐字逐句对照数据库的连接那一部分,发现在获取连接时,
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/messageboard?serverTimezone=CTT" + "&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true","root","mysql");
标红部分跟书上不一样,serverTimezone 表示时区,书上的时区是 GMT ,而这里是 CTT ,把它改成 GMT 后果然就可以连上数据库了。我想,应该是mysql服务器端的时区默认是GMT吧,所以在连接mysql时也要设置同样的时区。真是恨呐,明明控制台早就已经告诉我是时区 zone 的问题了,我还一直没有注意到,浪费了好多时间。故想将此经验分享出来,以便遇到同样问题的小伙伴有所参考,不至于走太多弯路。
public static Connection conn; //Connection对象(链接)
//连接数据库
public static Connection getConn(){
try{
//加载注册SQLSever的JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//编写链接字符串,创建并且获取链接
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/messageboard?serverTimezone=GMT"
+ "&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true","root","mysql");
return conn;
}catch(Exception e){
e.printStackTrace();
return null;
}