1. 数据库连接超载
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:102)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:861)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:449)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:234)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:180)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:682)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
at DataBaseClass.CourseMethod.PreemptiveAnswer(CourseMethod.java:71)
at server.ServerThread.run(ServerThread.java:189)
IO连接都给我直接断掉了
java.io.EOFException
at java.base/java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3217)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1698)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:525)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:483)
at server.ServerThread.run(ServerThread.java:96)
at java.base/java.lang.Thread.run(Thread.java:1570)
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:102)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:861)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:449)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:234)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:180)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:682)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
at DataBaseClass.MessageLoading.Student(MessageLoading.java:18)
at server.ServerThread.run(ServerThread.java:131)
at java.base/java.lang.Thread.run(Thread.java:1570)
原因是在测试消息的立马下滑至底端和只更新不下滑两种消息更新接受发送方式切换时,一下就发了大量的抢答消息给服务端,让服务端读取更新。(突然想起来第一次写实时更新的三重查找,会不会需要优化一下......)
在后面用conn.close关了连接后也是没有这个报错了,随便发多少MySQL请求都没有什么问题。
2. 数据库再次连接超载
一定要关conn!一定要关conn!一定要关conn!
这次连接MySQL数据库的频率并不是很块,但还是连接超了,所以一定要关conn!
而且它这个conn的数量最大值是对整个数据库(应该是对一个数据库)来说的,conn超了以后登录都登不上,长连接沉默了,也断了,短连接焊死了,卡的不能再动。
java.sql.SQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:102)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:861)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:449)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:234)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:180)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:682)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:230)
at DataBaseClass.MessageLoading.Teacher(MessageLoading.java:95)
at RealTimeDataBase.NewPageRealTime.MessageLoad2(NewPageRealTime.java:51)
at server.ServerThread.run(ServerThread.java:143)
at java.base/java.lang.Thread.run(Thread.java:1570)
最后再说一遍,无论不关什么都不要不关conn!这个需要一直用的东西有连接请求上限的!!!(也就是你的服务器还开着,那么他就会一直在那里......)
3.JavaFX静态图的多次加载
为了逻辑更加简单易懂,在登录时并初始化了所有的视图,并作为静态变量存储在类中
错误的调用
Scene scene = new Scene(StaticFxml.CheckInPage);
CheckInPage.stage.setScene(scene);
CheckInPage.stage.show();;
将会在第二次使用时报错,scene中的值无法重复使用
因此只需要像这样随便把静态视图外包一个Box就行了
HBox hBox = new HBox();
hBox.getChildren().addAll(StaticFxml.CheckInPage);
Scene scene = new Scene(hBox);
CheckInPage.stage.setScene(scene);
CheckInPage.stage.show();;
4. 修bug的思路
当一些不合理的程序运行结果出现时,就需要进行修复。我写项目时好像把一部分MemberLoading的实时更新和MessageLoading写一起了,可能教师把某个人踢出的时候消息VBox就下滑到最下面。虽然这个bug是实时更新混乱,但是改起来太费脑子了,我可以把踢出班级也作为一条消息进行提示,这样就合理了,也算是修复了bug.
5. 双端开发注意事项
1. 当有一端出现bug时,可尝试比较代码,找出错误点
2. UI更新用到的Message,立面的数据越少越好,最好只有一条,这样方便随时随地只用 1 - 2 次IO连接实现更新。(这个方法思路会简单,但是不知道会不会给MySQL数据库太多压力)
3. 其实只要做数据更新和页面根据数据的初始化更新就行了,会干扰的地方进行分开初始化,实时更新尽量就是给他发一个再次初始化更新页面的提醒,只样会简单很多。