4

同じクラスの異なるメソッドでいくつかの SQL クエリを実行する必要があります。これらのステートメントを共通にする方法はありますか?すべてのメソッドで同じ con,statement 変数を使用してクエリを実行できますか?

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection con = DriverManager.getConnection ("jdbc:mysql://localhost:3306/kamal","root","root");
Statement statement=con.createStatement();
4

6 に答える 6

5

クラスでこのメソッドを使用し、何度も呼び出します

public Connection getMyConnection() throws ClassNotFoundException, SQLException
    {
        String connectionURL = "jdbc:mysql://localhost:3306/test";
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(connectionURL, "root", "root");
        return con;
    }
于 2013-02-16T20:16:09.270 に答える
3

他のクラスで再利用できる静的メソッドで接続ステートメントを作成できます。

public Connection getConnection() throws ClassNotFoundException, SQLException {

    String connURL = "jdbc:mysql://localhost:3306/test";
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection(connURL, "username", "password");
    return con;
}

ただし、これには、データベース接続の開閉を手動で管理する必要があるという欠点があります。

上記の欠点を軽減するには、各データベース接続で再利用される設定ファイルに接続の詳細を抽象化する Hibernate などのオブジェクト関係マッピング フレームワークの使用を検討してください。

于 2013-02-16T20:13:19.747 に答える
1

これは、接続プールの非常に単純な実装です。これはメモ帳を使用して作成されており、テストされていないことに注意してください。

public interface ConnectionPool {
    public Connection getConnection() throws SQLException;
    public void closeConnection(Connection connection) throws SQLException;
}


public class MySQLConnectionPool implements ConnectionPool {
    private static final Class<?> mysqlDriver;
    private final Stack<Connection> connections;
    private final String url;
    private final String user;
    private final String password;
    private final int maxSize;

    static {
        mysqlDriver = Class.forName("com.mysql.jdbc.Driver");
    }

    public MySQLConnectionPool(String url, String user, String password, int initialSize, int size) {
        if (initialSize > size) {
            throw new IllegalArgumentException("Pool initial size must not be greater than size");
        }
        if (size <= 0) {
            throw new IllegalArgumentException("Pool size must be greater than zero");
        }
        this.size = maxSize;
        this.url = url;
        this.user = user;
        this.password = password;

        this.connections = new Stack<Connection>();
        try {
            for (int i = 0;i < initialSize;i++) {
                connections.push(getConnection(url, user, password));
            }
        } catch (Exception exception) {
            // TODO: Log somewhere?
        }
    }

    public Connection getConnection(String url, user, password) throws SQLException {
        DriverManager.getConnection(url, user, password);
    }

    public Connection getConnection() SQLException {
        try {
            synchronized (connections) {
                return connections.pop();
            }
        } catch (EmptyStackException exception) {
            return getConnection(url, user, password);
        }
    }

    public void closeConnection(Connection connection) throws SQLException {
        synchronized (connections) {
            if (connections.size() < maxSize) {
                connections.push(connection);
                return;
            }
        }
        connection.close();
    }
}


public class SingletonMYSQLConnectionPool extends MySQLConnectionPool() {
    private static volatile SingletonMYSQLConnectionPool instance;

    private SingletonMYSQLConnectionPool() {
        super("jdbc:mysql://localhost:3306/kamal","root","root", 0, 2);
    }

    public static SingletonMYSQLConnectionPool getInstance() {
        if (instance == null) {
            synchronized (SingletonMYSQLConnectionPool.class) {
                if (instance == null) {
                    instance = new SingletonMYSQLConnectionPool();
                }
            }
        }
        return instance;
    }
}
于 2013-02-16T21:13:26.297 に答える
1

クラス全体で変数が必要な場合は、メンバー変数にすることをお勧めします。

ただし、これはConnections、システムを簡単に奪い、余分な負荷をかける可能性があるため、 のようなリソースにはお勧めできません。

できることは、 と呼ばれるデザインパターンを使用することですSingleton。ここでそれについて読んでください

ConnectionManager基本的に、この実装で呼び出される新しいクラスを作成できます

class ConnectionManager {

private static ConnectionManager _instance = null;
private Connection con = null;

protected ConnectionManager() {
    //empty
}

private void init() {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    this.con = DriverManager.getConnection
          ("jdbc:mysql://localhost:3306/kamal","root","root");
}
public Connection getConnection() {
    return this.con;
}

public static ConnectionManager getInstance() {
    if(_instance == null) {
        _instance = new ConnectionManager();
        _instance.init();
    }
    return _instance;
}

}//end class

これは、特にアプリケーションがマルチスレッドの場合に、さまざまな点で役立ちます。プログラムが終了しない限り、接続は 1 つだけ必要です。新しい を作成する必要がある場所ならどこでもStatement、これを簡単に使用できます。

ConnectionManager.getInstance().getConnection().createStatement();
于 2013-02-16T20:15:04.047 に答える
-1

それらをデータベース内のストアド プロシージャにします。

于 2013-02-16T20:21:53.430 に答える