1

我正在使用 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 连接在每次调用该函数时保持打开状态。

谢谢!!

4

4 回答 4

6

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

于 2015-07-17T20:55:39.973 回答
2

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

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

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

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

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

于 2013-03-04T07:50:58.747 回答
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();
}
于 2013-03-04T07:53:47.593 回答
0

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

于 2013-03-04T07:57:18.213 回答