0

嗨,我正在做一个 jsp 项目。我将我的项目部署在 apache tomcat 上。我使用 mysql 作为数据库。

当我在远程服务器上部署项目时,它运行良好。但几个小时后它给了我sql错误。然后我回到我的 apache 服务器并再次启动项目它运行,几个小时后它再次给我同样的 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;
  }
4

2 回答 2

1

MySQL 的默认连接超时时间为 8 小时。因此,这意味着您将 SQL 连接保持打开的时间过长。您的代码表明您在应用程序启动时仅创建一个连接并在应用程序范围内重用它。这真是太糟了。这不是线程安全的。

您需要更改代码,以免在代码中的任何位置Connection将 SQL 声明和存储为静态或实例变量。相反,它应该在尽可能短的范围内被声明、创建和关闭。最好在与您执行 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.

也可以看看:

于 2012-04-26T13:46:29.737 回答
0

使用它们后是否正确关闭连接。

于 2012-04-26T09:56:25.760 回答