1

私はMySQLを使って最初のJavaプロジェクトに取り組んでいます。データソースからデータを取得するたびに呼び出される関数が1つあります。この関数は、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

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メソッドを呼び出すだけです。

したがって、urコードで次のことを実行する必要があります。

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 に答える