jsp mysql服务器连接超时

时间:2012-04-26 09:46:45

标签: mysql jsp tomcat

嗨,我正在做一个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;
  }

2 个答案:

答案 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)

使用后是否正确关闭连接?