【问题标题】:How to keep connection alive in java如何在java中保持连接活动
【发布时间】:2013-02-18 06:09:37
【问题描述】:

我正在使用 MySQL 开发我的第一个 Java 项目。每次从数据源取回数据时,我都会调用一个函数。这个函数应该在我的 MySQL 数据库中保存一个新行。看这里的代码:

import java.sql.*;
import java.util.Properties;

/**
 *
 * @author jeffery
 */
public class SaveToMysql {
    // The JDBC Connector Class.
    private static final String dbClassName = "com.mysql.jdbc.Driver";

    private static final String CONNECTION = "jdbc:mysql://localhost/test";

    static public String test(int reqId, String date, double open, double high, double low,
                                        double close, int volume, int count, double WAP, boolean hasGaps){

        if (date.contains("finished")){
            return "finished";
        }


        // Class.forName(xxx) loads the jdbc classes and
        // creates a drivermanager class factory
        try{
            Class.forName(dbClassName);
        }catch ( ClassNotFoundException e ) {
            System.out.println(e);
        }

        // Properties for user and password. Here the user and password are both 'paulr'
        Properties p = new Properties();
        p.put("user","XXXXXXXX");
        p.put("password","XXXXXXXXXXXx");

        // Now try to connect
        Connection conn;
        try{
            conn = DriverManager.getConnection(CONNECTION,p);
        }catch(SQLException e){
            return e.toString();
        }

        PreparedStatement stmt;
        try{
            stmt = conn.prepareStatement("insert into dj_minute_data set symbol = (select ticker from dow_jones_constituents where id = ?), "
                    + "date = str_to_date(?,'%Y%m%d %H:%i:%s')" +
            ", open = ?" +
            ", high = ?" +
            ", low = ?" +
            ", close = ?" +
            ", volume = ?" +
            ", adj_close = ?");
            stmt.setInt(1, reqId);
            stmt.setString(2, date);
            stmt.setDouble(3, open);
            stmt.setDouble(4, high);
            stmt.setDouble(5, low);
            stmt.setDouble(6, close);
            stmt.setDouble(7, volume);
            stmt.setDouble(8, WAP);
        }catch (SQLException e){
            return e.toString();
        }

        try{
            stmt.executeUpdate();
        }catch (SQLException e){
            return e.toString();
        }

        return stmt.toString();
    }

}

大家可以看到这个函数test 在它自己的类中,叫做SaveToMysql。为了调用这个函数,我将该类导入到另一个类中,并使用以下语法:

msg = SaveToMysql.test(reqId, date, open, high, low, close, volume, count, WAP, hasGaps);

然后将消息输出到屏幕。显示错误消息或成功。

这个函数可以在短时间内快速调用多次。我知道每次调用该函数时我都不必重新打开与 MySQL 服务器的连接。我将如何更改这一点,以便 1 MySQL 连接在每次调用该函数时保持打开状态。

谢谢!!

【问题讨论】:

    标签: java mysql database oop


    【解决方案1】:

    JDBC URL:jdbc:mysql://:/? connectTimeout=0&socketTimeout=0&autoReconnect=true

    【讨论】:

      【解决方案2】:

      我知道我不应该在每次调用该函数时都重新打开与 MySQL 服务器的连接。

      不,这样做很好 - 只要您在后台有一个连接池来管理 真实 连接。周围有各种连接池项目,比如c3p0DBCP。这样您就可以使您的每个呼叫与其他呼叫隔离:

      • 从池中获取连接
      • 使用它
      • 将其释放回池中

      有关详细信息,请参阅您选择的任何池的文档。通常,连接池允许您像往常一样从 JDBC 请求连接,然后照常关闭它,从而有效地使整个事情变得透明。

      还请注意,您应该绝对开始使用带参数的预准备语句,而不是直接在 SQL 语句中包含值。您当前的代码是 SQL injection attack 等待发生。

      【讨论】:

      • 感谢您对安全性的提醒,我将更新我的问题,以免给其他人关于如何执行此操作的错误想法。
      【解决方案3】:

      您需要管理一个静态类或方法。

      喜欢

      public class ConnectionClass
      {
          public static Connection connection = null;
      
          public Connection getCurrentConnection()
          {
              if(connection != null)
              {
                  return connection;
              }
              else
              {
                  create new connection...
                          and return that new connection after giving it to global connection..
              }
          }
      }
      

      每次您都将获得当前连接。如果有一些问题并且连接不可用,那么您可以创建新连接。当您需要连接对象时,您只需要调用 getCurrentConnection 方法即可。

      所以你只需要关注你的代码中的东西。

      Connection conn;
      try{
          //conn = DriverManager.getConnection(CONNECTION,p);
            conn = getCurrentConnection();
      }catch(SQLException e){
          return e.toString();
      }
      

      【讨论】:

      • 就像 SingleTone 设计模式。
      • 表示连接?意味着每次调用该方法都会建立新的连接?如果是,请提供您的代码。
      【解决方案4】:

      如果您想在多次调用 SaveToMysql.test 方法时使用 1 个连接,您可以在方法参数中添加您的连接,或者在 SaveToMysql.test 方法之外创建一个全局连接变量。但是,如果您使用 1 连接,请注意交易。希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 2012-11-12
        • 2018-11-08
        • 2013-01-27
        • 1970-01-01
        相关资源
        最近更新 更多