嗨,我正在做一个jsp项目。我在apache tomcat上部署我的项目。我使用mysql作为数据库。
当我在远程服务器上部署项目时,它运行良好。但几个小时后它给我sql错误。然后我回到我的apache服务器并再次启动projecet运行,几个小时后它再次给我同样的SQL错误。我不知道这个问题。是由我的java连接代码引起的,或者它是关于mysql服务器的。可以有人告诉我为什么它给我sql错误。?
public class ConnectionManager {
private String className = "com.mysql.jdbc.Driver";
private String userName ="username";
private String password = "password";
private String url = "jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8";
/**
* @uml.property name="connectionInstance"
* @uml.associationEnd
*/
private static ConnectionManager connectionInstance = null;
public ConnectionManager(){
}
public static synchronized ConnectionManager getInstance() {
if(connectionInstance == null) {
connectionInstance = new ConnectionManager();
}
return connectionInstance;
}
public Connection getConnection(){
Connection conn = null;
try {
Class.forName(className);
conn = DriverManager.getConnection (url, userName, password);
System.out.println("Connection Established");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
答案 0 :(得分:1)
MySQL的默认连接超时为8小时。所以这意味着你保持SQL连接打开的时间太长了。您的代码表明您在应用程序的启动时只创建了一个连接,并在应用程序范围内重用它。这真是太糟了。这不是线程安全的。
您需要更改代码,以免在代码中将SQL Connection
声明并存储为静态或实例变量 。相反,它应该在尽可能短的范围内声明,创建和关闭。最好在与执行SQL查询的方法块相同的范围内。
这是对您ConnectionManager
的一次轻微改写,它可以正常完成工作:
public class ConnectionManager {
private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String USERNAME ="username";
private static final String PASSWORD = "password";
private static final String URL = "jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8";
static {
try {
Class.forName(DRIVER);
}
catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(DRIVER + " missing in classpath!", e);
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
}
按如下方式使用:
public class SomeDAO {
public SomeEntity find(Long id) throws SQLException {
Connection connection = null;
// ...
try {
connection = ConnectionManager.getConnection();
// ...
}
finally {
// ...
if (connection != null) try { connection.close(); } catch(SQLException ignore) {}
}
return someEntity;
}
要提高连接性能,请使用连接池而不是DriverManager
。
答案 1 :(得分:0)
使用后是否正确关闭连接?