如何保持连接活着的java(How to keep connection alive in java

2019-10-17 18:20发布

我的工作我的第一个Java项目与MySQL。 我有一个函数被调用每一次我得到的数据从我的数据源回来的时间。 这个功能应该保存一个新行到我的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连接保持打开状态,每次调用该函数。

谢谢!!

Answer 1:

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

喜欢

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();
}


Answer 2:

JDBC网址为:jdbc:mysql的://:/? connectTimeout = 0&了socketTimeout = 0&autoReconnect的=真



Answer 3:

我知道我不应该再打开我与每一个函数被调用时MySQL服务器的连接。

不,这是罚款这样做-只要你有在引擎盖下的连接池来管理真正连接。 有各种不同的连接池的项目周围,如C3P0和DBCP 。 这样,你可以让你的每一个电话从相互隔离的:

  • 取从池中的连接
  • 用它
  • 其释放回池

请参阅你选择的细节为准池的文档。 通常,连接池可以只请求JDBC正常连接,然后将其关闭正常,有效地使整个事情透明。

还要注意的是你一定要开始使用准备好的语句与参数,而不是包括在SQL语句中直接你的价值观。 您当前的代码是一个SQL注入攻击等情况发生。



Answer 4:

如果你想使用1个连接时调用SaveToMysql.test方法很多次,你可以添加方法参数的连接,或创建一个全局变量连接出方SaveToMysql.test方法。 但是,如果使用1个连接,请有关事务的关注。 我希望这会帮助你。



文章来源: How to keep connection alive in java